我已经将 IO monad 描述为 State monad,其中状态是“现实世界”。这种 IO 方法的支持者认为,这使得 IO 操作变得纯粹,就像引用透明一样。这是为什么?从我的角度来看,IO monad 内部的代码似乎有很多可观察到的副作用。另外,是否有可能描述几乎任何非纯函数,例如现实世界的函数?例如,我们不能将 C 的 malloc 视为一个接受 a 的函数吗?真实世界和一个 Int 并返回一个指针和一个真实世界,就像在 IO monad 中一样真实世界是隐式的?
注意:我知道什么是 monad 以及它是如何使用的。请不要回复随机 monad 教程的链接,除非它专门解决了我的问题。
我认为我听到的最好的解释实际上是最近在 SO 上。IO Foo
是创建一个的秘诀Foo
。另一种常见的、更字面的说法是,它是一个“产生一个Foo
”。它可以被执行(多次)来创建一个Foo
或死于尝试。菜谱/程序的执行是我们最终想要的(否则为什么要写一个?),但是由一个IO
我们代码中的操作就是配方本身。
该配方是一个纯值,与String
是一个纯值。食谱可以以有趣的、有时甚至令人惊讶的方式组合和操纵,但这些食谱可以组合的方式有很多种(除了公然非纯粹的方法)unsafePerformIO
, unsafeCoerce
等)都是完全引用透明的、确定性的,以及所有这些好东西。所得到的配方绝对不依赖于除了它所建立的配方之外的任何事物的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)