我是 Haskell 编程语言的新手,我一直在绊倒IO
type 作为函数参数或返回类型。
playGame :: Screen -> IO ()
OR
gameRunner :: IO String -> (String -> IO ()) -> Screen -> IO ()
这是如何工作的,我有点困惑,因为我知道 String 需要单词而 Int 需要数字。什么是IO
在函数中使用expect或Return?
IO
这是 Haskell 区分引用透明代码和非引用透明代码的方式。IO a
是返回一个 IO 操作的类型a
.
您可以将 IO 操作视为一段等待执行的对现实世界有影响的代码。由于这种副作用,IO 操作不是引用透明的;因此,执行顺序很重要。这是main
Haskell 程序的功能是正确排序和执行所有 IO 操作。因此,当你编写一个返回的函数时IO a
,您实际上正在做的是编写一个函数,该函数最终返回一个操作 - 当执行时main
- 执行操作并返回a
.
更多解释:
引用透明度意味着您可以用函数的值来替换函数。引用透明函数不能有任何副作用;特别是,引用透明函数无法访问任何硬件资源,例如文件、网络或键盘,因为函数值将取决于其参数之外的其他内容。
像 Haskell 这样的函数式语言中的引用透明函数就像数学函数(域和余域之间的映射),而不仅仅是一系列关于如何计算函数值的命令式指令。因此,Haskell 代码告诉编译器一个函数是applied其参数,但它并没有说函数是called从而实际计算出来。
因此,引用透明函数并不意味着执行顺序。 Haskell 编译器可以自由地以任何它认为合适的方式评估函数 - 或者如果没有必要则根本不评估它们(称为惰性评估)。唯一的顺序来自数据依赖性,当一个函数需要另一个函数的输出作为输入时。
现实世界的副作用并不是参照透明的。您可以将现实世界视为某种有效函数发生变异的隐式全局状态。由于这种状态,执行顺序很重要:如果您首先从数据库读取然后更新它,或者反之亦然,则会有所不同。
Haskell 是一种纯函数式语言,它的所有函数都是引用透明的,编译也依赖于此保证。那么,我们如何处理操纵某些全局现实世界状态并且需要按一定顺序执行的有效函数呢?通过在这些函数之间引入数据依赖性。
这正是 IO 所做的:在底层,IO 类型将有效函数与虚拟状态参数包装在一起。每个 IO 操作都将此虚拟状态作为输入并将其提供为输出。将此虚拟状态参数从一个 IO 操作传递到下一个 IO 操作会创建数据依赖性,从而告诉 Haskell 编译器如何正确排序所有 IO 操作。
您看不到虚拟状态参数,因为它隐藏在一些语法糖后面:do
中的符号main
和其他 IO 操作,以及内部IO
type.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)