gpt4 book ai didi

haskell - Haskell中的IO类型是什么

转载 作者:行者123 更新时间:2023-12-02 16:03:24 26 4
gpt4 key购买 nike

我是 Haskell 编程语言的新手,我一直在将 IO 类型作为函数参数或返回类型时遇到困难。

playGame :: Screen -> IO ()

或者

gameRunner :: IO String -> (String -> IO ()) -> Screen -> IO ()

这是如何工作的,我有点困惑,因为我知道 String 需要单词而 Int 需要数字。函数中使用的 IO 期望或返回什么?

最佳答案

IO这是 Haskell 区分引用透明代码和非引用透明代码的方式。 IO a是返回 a 的 IO 操作的类型.

您可以将 IO 操作视为一段等待执行的对现实世界有影响的代码。由于这种副作用,IO 操作不是引用透明的;因此,执行顺序很重要。这是 main 的任务Haskell 程序的功能是正确排序和执行所有 IO 操作。因此,当您编写一个返回 IO a 的函数时,您实际上正在做的是编写一个函数,该函数最终返回一个操作 - 当由 main 执行时- 执行操作并返回 a

更多解释:

引用透明意味着您可以用函数的值替换函数。引用透明函数不能有任何副作用;特别是,引用透明函数无法访问任何硬件资源,例如文件、网络或键盘,因为函数值将取决于其参数之外的其他内容。

像 Haskell 这样的函数式语言中的引用透明函数就像数学函数(域和共域之间的映射),而不仅仅是一系列关于如何计算函数值的命令式指令。因此,Haskell 代码告诉编译器一个函数被应用到它的参数,但它并没有说一个函数被调用并因此被实际计算。

因此,引用透明函数并不意味着执行顺序。 Haskell 编译器可以自由地以任何它认为合适的方式评估函数 - 或者如果没有必要则根本不评估它们(称为惰性评估)。当一个函数需要另一个函数的输出作为输入时,唯一的排序来自于数据依赖性

现实世界的副作用并不是参照透明的。您可以将现实世界视为某种有效函数发生变异的隐式全局状态。由于这种状态,执行顺序很重要:如果您首先从数据库读取然后更新它,或者反之亦然,则会有所不同。

Haskell 是一种纯函数式语言,它的所有函数都是引用透明的,编译也依赖于此保证。那么,我们如何处理操纵某些全局现实世界状态并且需要按一定顺序执行的有效函数呢?通过在这些函数之间引入数据依赖性。

这正是 IO 所做的:在底层,IO 类型将有效函数与虚拟状态参数包装在一起。每个 IO 操作都将此虚拟状态作为输入并将其提供为输出。将此虚拟状态参数从一个 IO 操作传递到下一个会创建数据依赖性,从而告诉 Haskell 编译器如何正确排序所有 IO 操作。

您看不到虚拟状态参数,因为它隐藏在一些语法糖后面:do main 中的符号和其他 IO 操作,以及 IO 内类型。

关于haskell - Haskell中的IO类型是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61556650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com