什么是 Algebraic Effects(代数效应)?

1,788 阅读1分钟

以下纯属个人理解,如果错的离谱,欢迎喷我指出。

1. 什么是代数式?

回忆一下高深的小学数学,应该是长这样:

2x + 3y + 4z

可以给这个代数式起个名字 —— getNum。

2. 变成函数

function x() {}
function y() {}
function z() {}

function getNum() {
    let a = 2 * x()
    let b = 3 * y()
    let c = 4 * z()
    return a + b + c
}

上面代码中的 xyz 三个函数,就是「代数式」getNum 中的三个变量。

3. 有什么问题?

getNum 依赖于 xyz 三个函数。

以函数的作用来分类:做什么 -> getNum(),怎么做 -> x() y() z()

「做什么」与「怎么做」是耦合的。

4. 如何解耦?

function getNum() {
    let a = 2 * perform `x`
    let b = 3 * perform `y`
    let c = 4 * perform `z`
    return a + b + c
}

好了,先定义好「做什么」,保证主流程畅通,至于怎么做,关我屁事

至于「怎么做」,可以写在任意地方,比如另外一个文件中:

try {
  getNum();
} handle (effect) {
  if (effect === 'x') {
    // ...
  } else if (effect === 'y') {
    // ...
  } else if (effect === 'z') {
      // ...
  }
}

WARNING: 上面的是伪代码,目前 js 中并没有实现上述语法。

5. 什么是代数效应?

效应(Effects),就是 x y z 三兄弟,这三个函数会产生作用,它们被称为「效应」。

而代数(Algebraic),注意,是个形容词。

什么是代数效应?

就是「效应」如同「代数式」中的变量一样,被插入了函数。

所以「代码效应」这个翻译很猥琐,全称应该是「像是代数式中变量一样的效应」。

这就是我的理解,完了 😇。


如果觉得我说的很扯蛋,

赶紧看一下这个:overreacted.io/algebraic-e…

附赠中文版:zhuanlan.zhihu.com/p/76158581