En el módulo System.Info
veo estas funciones:
os :: String
arch :: String
compilerName :: String
compilerVersion :: Version
¿Por qué no hay IO
allí? Están accediendo al sistema ... ¿Me equivoco? Mi expectativa era algo así como:
os :: IO String
arch :: IO String
compilerName :: IO String
compilerVersion :: IO Version
Caso de uso:
print os -- "darwin"
print arch -- "x86_64"
print compilerName -- "ghc"
IO
allí, hay un envoltoriouname(3)
disponible en Hackage: hackage.haskell.org/package/bindings-unameLa pregunta es buena. La respuesta, tal como es, es que esos valores son estáticos por compilación del programa. Básicamente se compilan en el programa y nunca cambian después de eso. Como tal, nada (en los supuestos que usa GHC) se rompe si los trata como constantes. Y es más conveniente usar una constante simple que una acción IO.
Pero eso es todo tipo de razonamiento heredado. Haskell es un idioma antiguo. (No, en realidad, es más antiguo que Java por varios años). Se han creado muchas bibliotecas con razonamientos que ya no se consideran las mejores prácticas. Estos son ejemplos de eso. Una biblioteca moderna que los exponga probablemente los convierta en acciones de E / S aunque los resultados no cambien después de la compilación. Es más útil poner cosas que no son constantes en el nivel de origen detrás de las acciones de IO, aunque todavía hay algunas excepciones notables, como
Int
cambiar el tamaño entre las plataformas de 32 y 64 bits.En cualquier caso ... Diría que sus expectativas son sólidas, y esos tipos son el resultado de rarezas históricas.
fuente
EDITAR: Gracias a @interjay y @Antal Spector-Zabusky por explicar por qué se rechaza esta respuesta. Ellos escribieron
Actualmente tiene dos votos eliminados. Dejaré que el proceso siga su curso, pero sugiero que en realidad tiene algún valor. En una nota al margen, sus explicaciones muestran que la pregunta era débil, y también lo son las respuestas, ya que un novato de Haskell podría seguir fácilmente el razonamiento que hice.
Respuesta original:
No soy un programador de Haskell, pero las dos respuestas ya dadas no coinciden con la documentación que el OP enlazó.
Mi interpretación de la documentación sigue.
os :: String
- Esto le proporciona "El sistema operativo en el que se ejecuta el programa".Espero que esto emita una llamada al sistema para obtener la información. Debido a que el sistema en el que se compila el programa puede ser diferente del que se ejecuta, no puede ser un valor insertado por el compilador. Si el código se está interpretando, el intérprete puede proporcionar el resultado, que debe obtenerse a través de una llamada al sistema.
arch :: String
- Esto le proporciona "La arquitectura de la máquina en la que se ejecuta el programa".Nuevamente, espero que esto emita una llamada al sistema para obtener la información. Debido a que el sistema en el que se compila el programa puede ser diferente del que se ejecuta, no puede ser un valor insertado por el compilador.
compilerName :: String
- Esto le brinda "La implementación de Haskell con la que se compiló el programa o se está interpretando".Este valor es ciertamente insertado por el compilador / intérprete.
compilerVersion :: String
- Esto le proporciona "La versióncompilerName
con la que se compiló el programa o se está interpretando".Este valor es ciertamente insertado por el compilador / intérprete.
Si bien puede considerar que las dos primeras llamadas obtienen información, el resultado proviene de los valores que posee el sistema operativo. E / S generalmente se refiere al acceso al almacenamiento secundario.
fuente
IO
mónada para emular el estado, emular la secuencia de operacionesos :: String
para que haga una llamada al sistema cuando se evalúa.os
yarch
se obtienen en tiempo de ejecución.