跳到主要内容

集合式结构

Setoid 怎样定义同类型值的相等关系?​

  • Setoid: 提供 equals,用于比较同类型对象;
  • 数组示例: 先比较长度,再逐项比较;
const arrayEquals = (left, right) =>
left.length === right.length && left.every((value, index) => value === right[index]);

arrayEquals([1, 2], [1, 2]); // true
arrayEquals([1, 2], [0]); // false

半群需要满足什么?​

  • 半群(Semigroup): 同类型的两个值能通过 concat 结合;
  • 闭包: 结合结果仍属于同一类型;
  • 结合律: (a <> b) <> c = a <> (b <> c);
[1].concat([2]); // [1, 2]

幺半群比半群多了什么?​

  • 幺半群(Monoid): 半群加一个双侧单位元 empty;
  • 单位律: empty <> a = a 且 a <> empty = a;
  • 结合律: 改变分组不改变结果;
结构结合操作单位元
数字加法+0
数组连接concat[]
字符串连接concat''
1 + (2 + 3) === 1 + 2 + 3;
[1, 2].concat([]); // [1, 2]

为什么减法不是幺半群?​

  • 0 - 4 !== 4 - 0: 0 不是双侧单位元;
  • 减法也不满足结合律;
  • 因而它无法提供稳定的任意分组归约;