使用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 class="indent">
|
调用这段代码:
A a = new A();
a.push();
a.poll();
System.out.println(a.getState());
<p class="indent">
|
但是在面向函数编程中,没有对象的概念,函数是第一公民,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