跳到主要内容

代数数据类型

什么是代数数据类型?​

  • 代数数据类型(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