gpt4 book ai didi

haskell - IO 是免费的 Monad 吗?

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

blog posts和 Mark Seemann 的例子,我第一次看到了免费的单子(monad)作为构建纯代码和 IO 代码之间边界的一种方式。我的基本理解是,一个免费的 monad 可以让您构建一个纯函数的程序(抽象语法树 - AST),然后解释器将其转换为一系列不纯的过程调用。因此,该解释器将 AST 的纯操作转换为一元 IO 操作序列。

我想知道这是否重复了 Haskell 运行时已经对 IO monad 所做的事情。如果我认为 IO 没什么特别的,而是一个绑定(bind)函数 >>= 的常规 Monad通过 IO 中的所有单子(monad)操作对“真实世界”的状态进行排序,然后此排序本身不提供任何计算(如优秀答案 here 中免费单子(monad)的解释)。然后我可以查看所有 IO 操作,例如 getLine , writeFile等作为自由 IO monad 中的操作,以及作为解释器的 Haskell 运行时。运行时通过一些底层系统调用、C FFI调用等方式来解释每个IO Action ,这显然是不纯的。

因此,在这个 View 中,返回 IO 操作的函数只是构建 AST,然后由 Haskell 运行时解释。但到目前为止,一切都是纯净的。在此 View 中,函数 a -> IO b不是不纯的,就像在自由单子(monad)中的操作不是不纯的一样。

这种直觉正确吗?如果没有,它的不足之处在哪里?

最佳答案

你的直觉是正确的:IO -typed 函数确实构建了一个 Action 树,然后由运行时解释。好吧,至少这是一种有效的看待它的方式(另见 Will Ness 的评论)。

与自由单子(monad)的区别在于只有一个解释器。你不能选择另一个,如果你愿意,你也不能实现你自己的。

free monad 的 AST 有两个主要属性:首先,它是组合的;第二,可分析。解释器可以通过匹配其构造函数来分析 AST,并相应地执行解释。
IO monad 共享这些属性中的第一个,但不共享第二个。如果你有一个值 IO String ,无法判断它是否是通过调用 readLn 创建的或 pure "foo"或者是其他东西。

关于haskell - IO 是免费的 Monad 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61820358/

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