函数式编程 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函数式[刘烨前]

浙公网安备 33010602011771号