既然 Monad 是一个类型,你可能认为我们应该定义 Maybe 作为一个要被实例化的类。这虽然是一种有效的方法,但是它引入了 this 绑定的问题,所以在这里我不想讨论;相反,我打算使用一个简单的函数和对象的实现方式。
以下是 Maybe 的最简单的实现:
var Maybe = { Just, Nothing, of/* 又称:unit,pure */: Just }; function Just(val) { return { map, chain, ap, inspect }; // ********************* function map(fn) { return Just( fn( val ) ); } // 又称:bind, flatMap function chain(fn) { return fn( val ); } function ap(anotherMonad) { return anotherMonad.map( val ); } function inspect() { return `Just(${ val })`; } } function Nothing() { return { map: Nothing, chain: Nothing, ap: Nothing, inspect }; // ********************* function inspect() { return "Nothing"; } }