Monad详解

2016-11-11  本文已影响98人  飞鱼湾

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

1. Functors

图1 图2

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

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

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

具体操作步骤如下图解:

图4

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

图5

2. Applicatives

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

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

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

3. Monad

图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

上一篇下一篇

猜你喜欢

热点阅读