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

在看到List和Maybe Monad是如何定义之后,我自然对如何做好奇怪
 为IO monad定义操作>> =和return。
IO没有具体的实现;它是一个抽象类型,确切的实现未被Haskell报告定义。事实上,没有什么能阻止实现IO及其Monad实例作为编译器原语的实现,完全没有Haskell实现。

基本上,Monad用作IO的接口,它本身不能在纯Haskell中实现。这可能是你在这个阶段需要知道的,并且深入实现细节可能只是混淆,而不是提供洞察。

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

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

但是如果你真的想看到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是一个用于通过一系列计算访问和改变状态的单子;它表示为s – > (a,s)(其中s是状态的类型),看起来非常类似于GHC用于IO的类型,因此造成混淆。

http://stackoverflow.com/questions/9244538/what-are-the-definitions-for-and-return-for-the-io-monad

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:haskell – >> =和IO monad的定义是什么?