Monad函子是可以变扁的Pointed函子,IO(IO(x))
一个汉子如果具有join和of两个方法并遵守一些定律就是一个Monad
当一个函数返回一个函子使用Monad,解决函子嵌套的问题
合并一个函数并且这个函数返回一个值使用map
合并一个函数,函数返回一个函子,flatMap
const fs = require('fs')
const fp = require('lodash/fp')
class IO {
static of (value) {
return new IO(function() {
return value
})
}
constructor (fn) {
this._value = fn
}
map(fn) {
return new IO(fp.flowRight(fn, this._value)) // 组合函数形成一个新的函子
}
join() {
return this._value()
}
flatMap(fn) { // 同时调用map和join
return this.map(fn).join()
}
}
let readFile = function (filename) {
return new IO(function() {
return fs.readFileSync(filename, 'utf-8')
})
}
let print = function(x) {
return new IO(function () {
console.log(x)
return x
})
}
let r = readFile('package.json').flatMap(print).join()
let r = readFile('package.json').map(x => x.toUpperCase()).flatMap(print).join()
let r = readFile('package.json').map(fp.toUpper).flatMap(print).join()
console.log(r)
网友评论