编辑:感谢@interjay和@Antal Spector-Zabusky解释了为什么这个答案被否决。他们写
该文档有点误导。这些值被硬编码到GHC编译器中。在48年之后,您肯定知道实际的代码总是比文档重要。–昨天interjay @ andy256您完全正确地认为文档很糟糕(实际上,这就是Francisco首先问这个问题的原因),并且您的困惑是可以理解的。Haskell的问题是,如果这些String值可以在运行时更改,那将是一个严重的错误-不允许更改变量。这就是IO类型构造函数的意义-它表示一种允许访问“外部世界”的计算,因此其结果可以更改。进行系统调用是IO操作的一个很好的例子。…[1/2] – 9小时前Antal Spector-Zabusky @ andy256…(另一个IO操作可能是“更新全局计数器”。)因此,当我们看到String时,我们知道它不能与任何字符串进行任何通信。幕后的操作系统。这就是为什么,也许令人惊讶的是,如果您不习惯Haskell,实现os :: String来进行系统调用并不容易–任何这样的值在基本的Haskell中都是无法实现的,将违反每个程序员对程序的期望工作,甚至可能使编译器和优化器崩溃(从理论上讲不是–堆栈溢出问题使人们遇到类似问题)。[2/2] – Antal Spector-Zabusky 这就是为什么,也许令人惊讶的是,如果您不习惯Haskell,实现os :: String来进行系统调用并不容易–任何这样的值在基本的Haskell中都是无法实现的,将违反每个程序员对程序的期望工作,甚至可能使编译器和优化器崩溃(从理论上讲不是–堆栈溢出问题使人们遇到类似问题)。[2/2] – Antal Spector-Zabusky 这就是为什么,也许令人惊讶的是,如果您不习惯Haskell,实现os :: String来进行系统调用并不容易–任何这样的值在基本的Haskell中都是无法实现的,将违反每个程序员对程序的期望工作,甚至可能使编译器和优化器崩溃(从理论上讲不是–堆栈溢出问题使人们遇到类似问题)。[2/2] – Antal Spector-Zabusky 甚至可能使编译器和优化器崩溃(从理论上讲不是这样-堆栈溢出问题使人们遇到类似问题)。[2/2] – Antal Spector-Zabusky 甚至可能使编译器和优化器崩溃(从理论上讲不是这样-堆栈溢出问题使人们遇到类似问题)。[2/2] – Antal Spector-Zabusky
目前有两个删除票。我将顺其自然,但是建议它实际上具有一定的价值。从侧面说,他们的解释表明问题很薄弱,答案也很薄弱,因为Haskell新手可以轻松地遵循我的推理。
原始答案:
我不是Haskell程序员,但是已经给出的两个答案与OP链接的文档不匹配。
我对文档的解释如下。
os :: String
-这将为您提供“正在运行程序的操作系统”。
我希望这将发出系统调用以获取信息。因为在其上编译程序的系统可能与在其上运行的系统不同,所以它不能是编译器插入的值。如果正在解释代码,则解释器可以提供结果,该结果必须通过系统调用获得。
arch :: String
-这将为您提供“正在运行程序的计算机体系结构”。
同样,我希望这将发出系统调用以获取信息。因为在其上编译程序的系统可能与在其上运行的系统不同,所以它不能是编译器插入的值。
compilerName :: String
-这将为您提供“用于编译或正在解释程序的Haskell实现”。
该值肯定是由编译器/解释器插入的。
compilerVersion :: String
-这将为您提供“ compilerName
用于编译或正在解释程序的版本”。
该值肯定是由编译器/解释器插入的。
尽管您可能认为前两个调用正在获取输入,但结果来自操作系统保留的值。I / O通常是指辅助存储访问。
IO
在其中存在某些内容,uname(3)
可在Hackage上找到一个包装:hackage.haskell.org/package/bindings-uname