Monad(函子)

2021-09-26  本文已影响0人  湘兰沅芷

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)
上一篇 下一篇

猜你喜欢

热点阅读