- 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";
- }
- }
- // 代替不稳定的 `console.log( someObj.something.else.entirely )`:
- Maybe.of( someObj )
- .map( prop( "something" ) )
- .map( prop( "else" ) )
- .map( prop( "entirely" ) )
- .map( console.log );
- function isEmpty(val) {
- return val === null || val === undefined;
- }
- var safeProp = curry( function safeProp(prop,obj){
- if (isEmpty( obj[prop] )) return Maybe.Nothing();
- return Maybe.of( obj[prop] );
- } );
- Maybe.of( someObj )
- .chain( safeProp( "something" ) )
- .chain( safeProp( "else" ) )
- .chain( safeProp( "entirely" ) )
- .map( console.log );
- function Humble(egoLevel) {
- // 接收任何大于等于 42 的数字
- return !(Number( egoLevel ) >= 42) ?
- Maybe.of( egoLevel ) :
- Maybe.Nothing();
- }
- var bob = Humble( 45 );
- var alice = Humble( 39 );
- bob.inspect(); // Nothing
- alice.inspect(); // Just(39)
- function winAward(ego) {
- return Humble( ego + 3 );
- }
- alice = alice.chain( winAward );
- alice.inspect(); // Nothing
- var bob = Humble(41);
- var alice = Humble(39);
- var teamMembers = curry(function teamMembers(ego1, ego2) {
- console.log(`Our humble team 's egos: ${ego1} ${ego2}` );
- } );
- bob.map( teamMembers ).ap( alice );
- // Humble 队列:41 39'
- var frank = Humble(45);
- bob.map(teamMembers).ap(frank);
- frank.map(teamMembers).ap(bob);
- function introduction() {
- console.log( "I'm just a learner like you! :)" );
- }
- var egoChange = curry( function egoChange(amount,concept,egoLevel) {
- console.log(
- `
- ${amount > 0 ? "Learned" : "Shared"}
- ${concept}
- .`
- );
- return Humble( egoLevel + amount );
- } );
- var learn = egoChange( 3 );
- var learner = Humble( 35 );
- learner
- .chain( learn( "closures" ) )
- .chain( learn( "side effects" ) )
- .chain( learn( "recursion" ) )
- .chain( learn( "map/reduce" ) )
- .map( introduction );
- // 学习闭包
- // 学习副作用
- // 歇息递归
- var share = egoChange( -2 );
- learner
- .chain( learn( "closures" ) )
- .chain( share( "closures" ) )
- .chain( learn( "side effects" ) )
- .chain( share( "side effects" ) )
- .chain( learn( "recursion" ) )
- .chain( share( "recursion" ) )
- .chain( learn( "map/reduce" ) )
- .chain( share( "map/reduce" ) )
- .map( introduction );
- // 学习闭包
- // 分享闭包
- // 学习副作用
- // 分享副作用
- // 学习递归
- // 分享递归
- // 学习 map/reduce
- // 分享 map/reduce
- // 我只是一个像你一样的学习者 :)
来源: https://juejin.im/post/5a27525e6fb9a0451543bf87