Monad详解

最近几年,函数式编程变得越来越流程,其代码简洁、副作用小、维护成本低等特点,使得许多其它的语言也开始支持函数式编程,比如JavaC#等。本文主要介绍一下函数式编程中的一个重要概念:Monad。      从定义上看,Monad就是两个接口:一个是return,另一个是一个bind;只要实现这两个操作的类型,都是monad。但是在理解Monad之前,先要搞清楚两个概念:FunctorsApplicatives:   

1. Functors

  • 定义:把一个函数作用在数值类型(对值类型的封装,包含相关属性和方法)上,用 fmap 或者 <$> 表示这种运算。

  • 常规运算:把一个函数作用在一个普通数值上

图1

  • Functors运算: 如果把普通数值用上下文包括,生成一个数值类型,那么函数将无法处理该数值类型

图2

函数无法处理数值类型,于是就出现了Functors,它可以处理数值类型,例如:

> fmap (+3) (Just 2)
Just 5

> (+3) <$> (Just 2)
Just 5

图3

具体操作步骤如下图解:

图4

如果数值类型为Nothing,那么Functors作用后的结果也是Nothing:

图5

2. Applicatives

  • 定义: 把一个封装后的函数作用于数值类型(对值类型的封装,包含相关属性和方法),用liftA<*>定义这种运算。

  • 运算法则:可以把Applicatives看成是Functors中的函数也被封装了一层,然后再应用于数值类型

> Just (+3) <*> Just 2
Just 5

> liftA (Just (+3)) (Just 2)
Just 15

图6

如果数值类型为Nothing,那么Functors作用后的结果也是Nothing:

3. Monad

  • 定义: 把一个返回数值类型的函数作用于数值类型,用liftM>>=来定义这种运算。

  • 运算法则:可以把Monad看成是Applicatives中的函数返回值也是数值类型

图7

定义half是判断是否是偶数的函数, 作用于数值类型20,过程如下:

> Just 20 >>= half >>= half >>= half
Nothing

图8

如果数值类型为Nothing,那么Functors作用后的结果也是Nothing:

图9

由于Nothing作用于FunctorsApplicativesMonad时,都返回Nothing,所以它们都是Maybe类型。Maybe类型的定义如下:
data Maybe a = Nothing | Just a

图9


参考资料

http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html

http://www.ruanyifeng.com/blog/2015/07/monad.html?utm_source=tuicool

转载于:https://my.oschina.net/flyfishbay/blog/1456600

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值