haskell中的Monad小记

Haskell 中的Monad 小记

monad基本上可以解释为实现了lift,bind操作的类型类。具体解释可以参考wikipidia上的定义

Monad构成自三个部份:

  • 类型构造子 m m m,建造一个Monad类型 m    T m\space\space T m  T
  • 类型转换子,经常叫做unit或return,将一个对象x嵌入到Monad中:
   unit(x) :: x -> Monad x
  • 组合子,典型的叫做bind(约束变量的那个bind),并表示为中缀算子(>>=),去包装一个Monad变量,接着把它插入到一个Monad函数/表达式之中,结果为一个新的Monad:
(>>=) :: forall a b. m a -> (a -> m b) -> m b 

1. 解释 (>>=)

(>>=) 是一个二元运算符,它接受两个参数,一个参数是一个Monad(m a),一个参数是一个function(a -> m b).这个function接受的是一个a,返回是一个Monad(m b)
这个运算符做的事情可以理解为,将第一个参数(m a)解包,解出a,按照第二个参数,及那个函数指定的方法得到新的Monad,即(m b)
可以将其理解成 拆解 && 连接


看一个例子
这个例子来源于一个Monad 叫做Maybe.
add mx my = mx >>= λx -> (my >>= λy -> Just (x + y))
λ代表的是匿名函数.Just是Maybe类型的其中一个值构造器。
通过解释上边的例子,可以理解>>=这个运算符
mx解包成x,带入后边的匿名函数中。后边的匿名函数需要输入一个my.然后将y解包,组合x + y后进入Just值构造器。


接下來,看haskell的语法实现和do语法糖

add mx my =
    mx >>= (\x ->
        my >>= (\y ->
            return (x + y)))

实现了上边写的add函数。用do语法糖就可以写成下边的形式.注意,do后语句在不加大括号和分号分割的情况下,缩进要一致。

add mx my = do
    x <- mx
    y <- my
    return (x + y)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值