为什么需要Monad?

15-07-26 banq
              

使用Monad可以解决下面两个问题:

1. 假设每个函数会按次序共享一个全局状态,那么我们使用StateMonad。多个函数共享一个全局状态在面向对象范式中是使用对象Object完成,状态作为对象的字段,而函数作为对象的方法,如下:

Class A{
   private int stat;

   public void Push(){
     state= state +1;
   }

   public void Poll(){
     state= state - 1;
   }

   public int getStat(){
     return state;
    }

}
<p>

调用这段代码:

A a = new A();
a.push();
a.poll();
System.out.println(a.getState());

<p>

但是在面向函数编程中,没有对象的概念,函数是第一公民,Class类不再存在,那么如何实现呢? 使用Monad。

将状态封装起来,作为Push函数输入参数,Push输出也是一个封装起来的盒子,再作为Poll的输入,Poll的输出也是一个封装盒子,打开盒子,取出的值就和上面Java代码调用a.getState()的值时一样的了。

2. 在函数编程中需要纯函数,杜绝不纯函数,所谓不纯函数就是:对于同样的输入,该函数会产生不同的输出结果,纯函数正好相反,无论是什么输入,该函数输出同样的结果。

我们可以使用monad将这些不纯的函数转为纯函数,不纯函数输出的是不同结果,我们将这些不同结果再封装起来,放入一个盒子中,这样,输出的是这个盒子类型,这就变成了一个纯函数,具体应用可以见IO Monad等链式调用。

具体Monad实现可见:

函数编程中functor和monad的形象解释

JavaScript的Monad

haskell - Why do we need monads? - Stack Overflow

              

1