Saber2pr's Blog

函数式设计

现在有一个这样的变量(函数变量,类型必须为 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 的函数