函数式编程 monad 小demo

var fs = require("fs");
var _ = require('lodash');

// 基础函子

class Functor{
    constructor(val){
        this.val = val
    }
    map(f) {
        return new Functor(f(this.val))
    }
}

// Monad 函子

class Monad extends Functor{
    join(){
        return this.val;
    }
    flatMap(f){
        return this.map(f).join()
    }
}

var compose = _.flowRight;

// IO 函子 : 用来包裹脏操作

class IO extends Monad {
    static of (val){
        return new IO(val)
    }
    map(f){
        return IO.of(compose(f,this.val))
    }
}

var readFile = function (filename) {
    return IO.of(function () {
        return fs.readFileSync(filename,'utf-8');
    });
}

var print = function (x) {
    console.log("print_O(∩_∩)O~~");
    return IO.of(function () {
        console.log("2222");
        return x+ "函数式"
    })
}

var tail = function (x) {
    console.log("tail(∩_∩)O~~");
    return IO.of(function () {
        console.log("5555");
        return x+ "[刘烨前]"
    })
}

const result = readFile('./user.txt')
.flatMap(print)()
.flatMap(tail)();

console.log(result.val())

运行结果:

print_O(∩_∩)O~~
2222
tail(∩_∩)O~~
5555
hello函数式[刘烨前]

posted @ 2020-02-21 21:35  比特与背包  阅读(133)  评论(0)    收藏  举报