(转)对 haskell 与 monad 的理解

对 haskell 与 monad 的理解

 

http://www.opengpu.org/bbs/viewthread.php?tid=2638&extra=page%3D1





haskell作为纯函数式语言如何处理IO

并不是真正的处理,只是通过类型系统将跟IO相关的“不纯”的代码和其他纯函数式代码隔离开。通过编译期类型检查进行保证。

具体实现就是通过叫 IO 的 type constructor [io] ,而这个 IO 就是 Monad 的一种。



Monad是什么

数学上Monad是一门处理状态转换的数学理论。

对于haskell来说,Monad 就是一个 type class [monad] ,这个 type class 定义了一组接口,前面说的 IO 就是实现了这组接口的实例。
  1. class Monad m where
  2.     (>>=) :: forall a b. m a -> (a -> m b) -> m b
  3.     (>>) :: forall a b. m a -> m b -> m b
  4.     return :: a -> m a
  5.     fail :: String -> m a
复制代码



.
这些接口目的何在
  1. foo,bar :: String->IO String
  2. foo msg = return ("foo "++msg)
  3. bar msg = return ("bar "++msg)

  4. main = do
  5.     foo "world"
  6.     name <- getLine
  7.     bar name
复制代码
上面的do语法糖扩展出来实际上是下面这样:
  1. foo "world" >>=
  2.   (\_ ->
  3.     getLine >>=
  4.       (\name ->
  5.         bar name)))
复制代码

这些接口的目的就在于保证操作的顺序执行,也就是说实现了这些接口的类型,使用do语法就可以编写顺序执行的语句了。

haskell 的 IO 类型就是利用这点保证IO操作的顺序执行,并通过类型系统将涉及IO和不涉及IO操作的函数清晰地区别开来。


[io] [url=http://www.haskell.org/ghc/docs/ ... base/System-IO.html]http://www.haskell.org/ghc/docs/ ... base/System-IO.html[/url]

[monad] http://www.haskell.org/ghc/docs/ ... /Control-Monad.html



from : http://www.yi-programmer.com/blo ... kell_and_monad.html
 

<script src="tag.php?action=relatetag&amp;rtid=2638" type="text/javascript"></script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值