SuperAPI AI 工具集

fp-ts Algebraic Data Types and Type Classes

编程与开发

查看项目

更新于 10-16 02:06

技能介绍

用途

本技能聚焦于 fp-ts 中的代数数据类型(Algebraic Data Types, ADT)与类型类(Type Classes),帮助开发者在 TypeScript 中构建更健壮、可维护的领域模型。它适用于需要精确表达业务状态、组合数据、以及定义可复用行为的场景。

主要能力

代数数据类型

代数数据类型是由其他类型组合而成的复合类型,分为两类:

  • 积类型(Product Types):使用“与”组合类型,如元组(tuple)和记录(record)。例如,一个用户同时拥有姓名和邮箱。
  • 和类型(Sum Types):使用“或”组合类型,即可辨识联合(discriminated unions)。例如,一个结果要么是成功,要么是失败。

类型类

类型类定义了一组可针对不同具体类型实现的行为。在 fp-ts 中,它们以接口形式表示,并为特定类型提供实例:

  • Eq:相等性比较
  • Ord:排序/比较
  • Semigroup:合并两个相同类型的值
  • Monoid:带有单位元(identity element)的 Semigroup

使用方式

积类型

积类型表示同时包含所有组成部分的值。

元组:固定长度且位置有类型的数组。示例代码展示了如何定义元组类型、访问元素、以及使用 fp-ts 的 Tuple 模块进行映射和双映射操作。

记录(对象类型):TypeScript 中最常见的积类型。示例展示了如何定义领域模型接口(如 User、Order),并强调所有字段必须同时存在。

何时使用积类型:当实体需要所有数据片段才有效、数据自然属于一起、建模数据库实体或 API 负载、组件总是同时出现时。

和类型(可辨识联合)

和类型表示可以是多种变体之一的值。

基本可辨识联合:示例定义了 PaymentMethod 类型,包含 CreditCard、PayPal、BankTransfer、Crypto 等变体,每个变体有唯一的 _tag 字段。

模式匹配:通过 fold/match 函数实现穷尽性模式匹配。示例展示了如何为 PaymentMethod 定义 fold 函数,并根据 _tag 分支处理。

智能构造器:示例展示了 RemoteData 类型(NotAsked、Loading、Failure、Success)的智能构造器和类型守卫,以及如何在 React 中使用 fold 进行渲染。

何时使用和类型:当值可以处于不同状态、不同变体有不同数据形状、需要穷尽处理所有情况、建模状态机或工作流时。

Semigroup

Semigroup 定义如何合并两个相同类型的值,必须满足结合律:combine(combine(a, b), c) === combine(a, combine(b, c))。

基本用法:示例展示了内置 Semigroup(如数字求和、乘积、字符串连接)以及 concatAll 的用法。

自定义实例:示例展示了如何定义取第一个值、取最后一个值、取最大值、取最小值的 Semigroup。

实际示例:合并配置。示例展示了如何为 ServerConfig 定义 Semigroup,使用 last 覆盖、max 取最大值、以及数组合并去重。

可选值的 Semigroup:示例展示了如何为 Option 类型定义 Semigroup,以及合并部分配置。

Monoid

Monoid 是带有单位元(empty)的 Semigroup。单位元满足:concat(empty, a) === a 且 concat(a, empty) === a。

基本用法:示例展示了内置 Monoid(如数字求和、乘积、字符串连接、数组)以及 concatAll 的用法。

自定义实例:示例展示了布尔 AND 和 OR 的 Monoid。

实际示例:合并结果。示例展示了如何为 AggregationResult 定义 Monoid,用于聚合处理结果(总数、成功数、错误数、错误列表、处理时间)。

统计 Monoid:示例展示了如何为 Statistics 定义 Monoid,用于计算计数、总和、最小值、最大值,并进一步计算平均值。

Eq 类型类

Eq 定义类型的相等性比较。

基本用法:示例展示了内置 Eq 实例(数字、字符串)以及数组的 Eq。

自定义实例:示例展示了如何为 User 类型定义 Eq 实例(内容在提供的资料中截断,未完整展示)。

适用场景

  • 需要精确建模业务领域中的状态和变体时
  • 需要组合和聚合数据(如配置合并、统计计算)时
  • 需要定义可复用的相等性、排序、合并行为时
  • 使用 TypeScript 进行函数式编程时

限制

  • 提供的资料中未提及该技能的安装方式、依赖要求、版本兼容性、收费模式或平台限制。
  • 部分代码示例(如 User 的 Eq 实例)在资料中不完整,无法展示完整实现。
  • 该技能假设读者已具备 TypeScript 和 fp-ts 的基础知识。