EDIT: Obrigado a @interjay e @Antal Spector-Zabusky por explicar por que esta resposta está sendo votada abaixo. Eles escreveram
A documentação é um pouco enganadora. Os valores são codificados no compilador GHC. Após 48 anos, você certamente sabe que o código real sempre supera a documentação. - interjay ontem @ andy256 Você está absolutamente certo de que a documentação está ruim (de fato, é parte do motivo pelo qual Francisco fez essa pergunta em primeiro lugar) e sua confusão é compreensível. O problema de Haskell é que, se esses valores de String pudessem variar em tempo de execução, isso seria um erro flagrante - as variáveis não podem mudar. Esse é o significado do construtor do tipo IO - ele representa uma computação que tem permissão para acessar o "mundo exterior" e, portanto, um cujo resultado pode mudar. Fazer uma chamada do sistema é um bom exemplo de uma ação de E / S. … [1/2] - Antal Spector-Zabusky 9 horas atrás @ andy256… (Outra ação de IO pode ser "atualizar um contador global".) Portanto, quando vemos uma String, sabemos que ela não pode fazer nenhuma comunicação com o sistema operacional sob o capô. É por isso que, talvez surpreendentemente, se você não está acostumado ao Haskell, não seria fácil implementar o os :: String para fazer uma chamada do sistema - qualquer valor desse tipo não é implementável no Haskell básico, violaria a expectativa de todos os programadores de como os programas trabalhar e até potencialmente desarmar o compilador e o otimizador (não é uma preocupação teórica - existem respostas do Stack Overflow em que as pessoas encontram problemas análogos). [2/2] - Antal Spector-Zabusky É por isso que, talvez surpreendentemente, se você não está acostumado ao Haskell, não seria fácil implementar o os :: String para fazer uma chamada do sistema - qualquer valor desse tipo não é implementável no Haskell básico, violaria a expectativa de todos os programadores de como os programas trabalhar e até potencialmente desarmar o compilador e o otimizador (não é uma preocupação teórica - existem respostas do Stack Overflow em que as pessoas encontram problemas análogos). [2/2] - Antal Spector-Zabusky É por isso que, talvez surpreendentemente, se você não está acostumado ao Haskell, não seria fácil implementar o os :: String para fazer uma chamada do sistema - qualquer valor desse tipo não é implementável no Haskell básico, violaria a expectativa de todos os programadores de como os programas trabalho e, potencialmente, até desarmar o compilador e o otimizador (não é uma preocupação teórica - existem respostas do Stack Overflow em que as pessoas enfrentam problemas análogos). [2/2] - Antal Spector-Zabusky e potencialmente até desativa o compilador e o otimizador (não é uma preocupação teórica - existem respostas do Stack Overflow em que as pessoas encontram problemas análogos). [2/2] - Antal Spector-Zabusky e potencialmente até desativa o compilador e o otimizador (não é uma preocupação teórica - existem respostas do Stack Overflow em que as pessoas encontram problemas análogos). [2/2] - Antal Spector-Zabusky
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ão compilerNamecom 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.
IOlá, há um invólucro em tornouname(3)acessível em Hackage: hackage.haskell.org/package/bindings-uname