代数数据类型
什么是代数数据类型?
- 代数数据类型(ADT): 通过组合其他类型得到的复合类型;
- 两类基本组合: 和类型与积类型;
- “代数”来源: 可用加法和乘法计算可能值的数量;
和类型为什么对应加法?
- 和类型: 一个值只能属于多个候选分支中的一个;
- 可能值数量: 各分支数量之和;
- 别名: 联合类型、可辨识联合、标签联合;
const booleans = new Set([true, false]);
const halfTrue = new Set(["half-true"]);
const weakLogic = new Set([...booleans, ...halfTrue]);
// 2 + 1 = 3 个可能值
- JavaScript 可用带标签对象模拟;Flow 联合类型和 TypeScript 可辨识联合提供静态表达;
积类型为什么对应乘法?
- 积类型: 一个值同时包含多个组成部分;
- 可能值数量: 各字段可能值数量的乘积;
- 常见形式: 元组、记录、对象和结构体;
// point :: (Number, Number) -> { x: Number, y: Number }
const point = (x, y) => ({ x, y });
怎样快速区分和类型与积类型?
| 问题 | 类型 |
|---|---|
| 从多个分支中选择一个 | 和类型 |
| 同时拥有多个字段 | 积类型 |
Option<A> = None + Some<A>
Point = X × Y