No módulo System.Info
, vejo estas funções:
os :: String
arch :: String
compilerName :: String
compilerVersion :: Version
Por que não há IO
lá? Eles estão acessando o sistema ... Estou errado? Minha expectativa era algo 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
lá, há um invólucro em tornouname(3)
acessível em Hackage: hackage.haskell.org/package/bindings-unameA pergunta é boa. A resposta, como é, é que esses valores são estáticos por compilação do programa. Eles são essencialmente compilados no programa e nunca mudam depois disso. Como tal, nada (nas suposições que o GHC usa) quebra se você as tratar como constantes. E é mais conveniente usar uma constante simples do que uma ação de E / S.
Mas esse é todo o tipo de raciocínio legado. Haskell é um idioma antigo. (Não, na verdade, é mais antigo que Java há vários anos.) Muitas bibliotecas foram construídas com um raciocínio que não é mais considerado uma prática recomendada. Estes são exemplos disso. Uma biblioteca moderna que os expõe provavelmente faria ações de IO, mesmo que os resultados não sejam alterados após a compilação. É mais útil colocar coisas que não são constantes no nível de origem por trás das ações de E / S, embora ainda existam algumas exceções notáveis, como
Int
alterar o tamanho entre plataformas de 32 e 64 bits.De qualquer forma ... eu diria que suas expectativas são sólidas e esses tipos são resultados de esquisitices históricas.
fonte
EDIT: Obrigado a @interjay e @Antal Spector-Zabusky por explicar por que esta resposta está sendo votada abaixo. Eles escreveram
Atualmente, possui dois votos para exclusão. Deixarei que esse processo siga seu curso, mas sugiro que realmente tenha algum valor. Em uma nota lateral, suas explicações mostram que a pergunta era fraca, e também as respostas, pois um novato em Haskell poderia facilmente seguir o raciocínio que eu fiz.
Resposta original:
Eu não sou um programador Haskell, mas as duas respostas já dadas não correspondem à documentação que o OP vinculou.
Minha interpretação da documentação segue.
os :: String
- Isso fornece "O sistema operacional no qual o programa está sendo executado".Espero que isso emita uma chamada do sistema para obter as informações. Como o sistema no qual o programa é compilado pode ser diferente daquele em que é executado, não pode ser um valor inserido pelo compilador. Se o código estiver sendo interpretado, o intérprete poderá fornecer o resultado, que deve ser obtido por meio de uma chamada do sistema.
arch :: String
- Isso fornece "A arquitetura da máquina na qual o programa está sendo executado".Novamente, espero que isso faça uma chamada do sistema para obter as informações. Como o sistema no qual o programa é compilado pode ser diferente daquele em que é executado, não pode ser um valor inserido pelo compilador.
compilerName :: String
- Isso fornece "A implementação do Haskell com a qual o programa foi compilado ou está sendo interpretado".Este valor é certamente inserido pelo compilador / intérprete.
compilerVersion :: String
- Isso fornece "A versãocompilerName
com a qual o programa foi compilado ou está sendo interpretado".Este valor é certamente inserido pelo compilador / intérprete.
Embora você considere a obtenção da entrada das duas primeiras chamadas, o resultado vem dos valores mantidos pelo sistema operacional. E / S geralmente se refere ao acesso ao armazenamento secundário.
fonte
IO
mônada para emular o estado, emular a sequência de operaçõesos :: String
que ele faça uma chamada de sistema quando for avaliada.os
earch
são obtidos em tempo de execução.