为什么需要Monad?

使用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;
}

}

调用这段代码:


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

但是在面向函数编程中,没有对象的概念,函数是第一公民,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