现在有一个这样的变量(函数变量,类型必须为 a => a):
const fn = a => a
现在 fn 函数读取一个外部变量:
import op from 'op'
// op: a => a
const fn = a => op(a)
这样这个 fn 函数就不纯,将它改成这样:
const fn = (op, a) => op(a)
但是 fn 必须为 a => a 类型,则需要一个辅助函数:
const pure = fn => op => a => fn(op, a)
const func = pure((op, a) => op(a))
const fn = func(op)
这个 pure 函数接收 (op, a) => a 输出 op => a => a 类型。
如果现在需要修改 func 内部的操作,例如 op(a)变成 op(a + a),则又需要一个辅助函数:
const fmap = join => func => pure(join(func))
const func2 = fmap(func => (op, a) => func(op)(a + a))
const fn = func2(func)(op)
总结:
如果一个函数需要有副作用,就写一个生成 Monad 的函数,然后再写操作 Monad 的函数、执行 Monad 的函数