ADT
Contents
什么是代数数据类型
(缩写:ADT)是一种复合类型,指由其他资料类型组合而成的类型,在电脑编程中,尤其是函数式编程和类型论中应用。 两类常见的代数类型是积类型(即元组和记录)与和类型(即标签联合)
积类型(&): 值通常包含多个值,即字段。该类型的所有值都有相同的字段类型组合。一个积类型的所有可能值的集合是其字段类型的所有可能值的集合的集合论乘积,即笛卡尔积。 比如:
type Human = { name: string; species: string } & { name: string, type: string }
和类型(|): 值通常被分组为多个类别,即变体。一个变体类型的值通常是用一个叫做构造器的准功能实体创建的。每个变体都有自己的构造函数,它接受指定数量的参数,并具有指定的类型。和类型的所有可能值的集合是其变体的所有可能值的集合的集合论之和,即不相连的联合。枚举类型是和类型的一个特例,其中构造函数不需要参数,因为每个构造函数只定义一个值。 比如:
type num = int | float
ADT 在函数式中有什么用处
ADT (代数数据类型) 在函数式编程中主要用于:
- 精确建模: 使用 和类型 (Sum Types, 如
Either a b
,Maybe a
) 表示“或”关系(多种可能形态之一),使用 积类型 (Product Types, 如元组(a, b)
, 记录{x: a, y: b}
) 表示“与”关系(多个值的组合)。这使得数据结构能非常精确地反映领域模型。 - 增强类型安全: 编译器可以检查你是否处理了和类型的所有可能情况(通过模式匹配),从而在编译时捕获错误,避免运行时问题(如空指针异常)。
- 支持模式匹配 (Pattern Matching): 这是处理 ADT 的核心方式。模式匹配允许你根据数据的具体构造(是哪个变体,包含什么值)来解构数据并执行相应逻辑,代码清晰且安全。
- 促进不变性 (Immutability): ADT 实例通常是不可变的,符合函数式编程的核心原则。修改数据通常意味着创建一个新的实例。
- 替代异常/null:
Option=/=Maybe
类型优雅地处理了可能缺失的值,=Either=/=Result= 类型显式地处理了可能失败的操作,比使用null
或抛出异常更安全、更函数式。
Author [Lin Chen]
LastMod 2025-04-10 (e85bbdd)