gpt4 book ai didi

haskell - IO monad 的 >>= 和 return 的定义是什么?

转载 作者:行者123 更新时间:2023-12-03 07:33:10 24 4
gpt4 key购买 nike

在看到 List 和 Maybe monad 是如何定义的之后,我自然很好奇它们是如何定义的 操作 >>=return 是为 IO monad 定义的。

最佳答案

IO没有具体的实现;它是一个抽象类型,Haskell 报告未定义确切的实现。事实上,没有什么可以阻止将 IO 及其 Monad 实例实现为编译器原语的实现,而根本没有 Haskell 实现。

基本上,Monad 用作 IO接口(interface),它本身无法在纯 Haskell 中实现。这可能是您现阶段需要了解的全部内容,深入研究实现细节可能只会造成困惑,而不是提供洞察力。

也就是说,如果你查看 GHC 的源代码,你会发现它将 IO a 表示为一个函数,看起来像 State# RealWorld -> (# State# RealWorld, a #) (使用 unboxed tuple 作为返回类型),但这具有误导性;这是一个实现细节,这些 State# RealWorld 值在运行时实际上并不存在。无论在理论上还是在实践中,IO不是一个状态单子(monad),1

相反,GHC 使用不纯原语来实现这些 IO 操作; State# RealWorld“值”只是通过引入从一个语句到下一个语句的数据依赖性来阻止编译器重新排序语句。

但是如果您确实想查看 GHC 的 return(>>=) 实现,它们是:

returnIO :: a -> IO a
returnIO x = IO $ \ s -> (# s, x #)

bindIO :: IO a -> (a -> IO b) -> IO b
bindIO (IO m) k = IO $ \ s -> case m s of (# new_s, a #) -> unIO (k a) new_s

其中 unIO 只是从 IO 构造函数内部解包函数。

需要注意的是,IO a 表示不纯计算的描述,可以运行该计算来生成 a 类型的值。事实上,有一种方法可以从 GHC 的 IO 内部表示中获取值,但这并不意味着这通常成立,或者您可以对所有 monad 执行这​​样的操作。这纯粹是 GHC 方面的实现细节。

1 state monad是一个 monad,用于通过一系列计算访问和改变状态;它表示为 s -> (a, s) (其中 s 是状态类型),看起来与 GHC 用于 IO< 的类型非常相似,因此造成困惑。

关于haskell - IO monad 的 >>= 和 return 的定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9244538/

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