集合式结构
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不是双侧单位元;- 减法也不满足结合律;
- 因而它无法提供稳定的任意分组归约;