Fantasy Land 实现生态大赏:Sanctuary、Fluture、Folktale 等 20+ 库对比
【免费下载链接】fantasy-landSpecification for interoperability of common algebraic structures in JavaScript项目地址: https://gitcode.com/gh_mirrors/fa/fantasy-land
Fantasy Land 是 JavaScript 生态中一份定义常见代数结构互操作性的开放规范(Specification),它通过统一的方法名约定,让 Sanctuary、Fluture、Folktale 等 20+ 个功能编程库能够无缝协作。本文带你快速看懂这份规范的核心设计,并对比各主流实现库的定位与适用场景 🧙
一分钟了解:Fantasy Land 是什么?
Fantasy Land(又名Algebraic JavaScript Specification)解决的是一个很实际的问题:
不同库各自实现了
map、chain、of等概念,方法名却五花八门,导致库与库之间无法互相消费对方的数据结构。
Fantasy Land 的方案非常巧妙:为 23 个标准行为规定统一的方法名(如fantasy-land/map、fantasy-land/chain)。任何库只要按约定实现这些方法,就能被所有遵循该规范的库识别和使用。
核心事实速览:
| 项目 | 说明 |
|---|---|
| 规范版本 | 5.0.1(package.json) |
| 代数结构 | 24 种(Setoid、Functor、Applicative、Monad…) |
| 标准方法名 | 23 个,见 names 清单 |
| 许可证 | MIT |
| 兼容实现 | 20+ 个库,见 implementations.md |
23 个标准方法名一览:互操作的核心约定
整个规范的方法名集合非常精简,全部定义在 names 文件中,并在 index.js、index.mjs 和 index.d.ts 中导出供库使用。按"代数"分组后,新手更容易理解:
| 分组 | 方法名 | 通俗理解 |
|---|---|---|
| 相等与序 | equals、lte | 比较两个值是否相等 / 谁更小 |
| 组合 | compose、id | 函数/箭头的组合与恒等 |
| 结合与单位元 | concat、empty、invert | 合并两个值、空值、取逆元 |
| 映射与变换 | map、contramap、bimap、promap | 在容器内部施加函数变换 |
| 应用 | ap、of | 把"容器中的函数"应用到"容器中的值" |
| 选择与回退 | alt、zero、filter | 二选一、空选择、条件过滤 |
| 遍历与折叠 | reduce、traverse | 逐个消费、跨容器遍历 |
| 串接与递归 | chain、chainRec | 嵌套容器摊平、尾递归安全的迭代 |
| 扩展与提取 | extend、extract | 基于整个容器计算新值、取出值 |
完整的类型签名与定律(Laws)说明都在 README.md 中,每种代数(如 Functor、Monad)都列出了必须满足的定律——这是库实现必须遵守的"游戏规则"。
💡 各代数之间的依赖关系(如 Monad 依赖 Applicative 和 Chain)可以用 figures/dependencies.dot 中的图数据渲染查看。
生态大赏:20+ 个实现库横向对比
implementations.md 收录了所有符合规范的实现。按用途可分为六大类,方便你按需选型:
📦 Promise 替代品:Monad 化的异步
| 库 | 特点 |
|---|---|
| Fluture | 高性能的 Promise 单代(Monad)替代品,异步编程首选 |
| Pacta | 代数化的 Promise,实现完整 |
| Fantasy Promises | 给原生 Promise 加上 Monad 与 Functor 能力 |
| creed | 支持 Promise/A+ 与 ES2015 Promise 互操作 |
| Pirandello | 带 MonadPlus 的"更好"的流 |
🛡️ 安全值类型:告别 null 与 undefined
| 库 | 特点 |
|---|---|
| Sanctuary | "逃离不安全 JavaScript"的圣地,提供 FL 兼容的 Either 与 Maybe |
| Folktale | 提供 Maybe、Result、Validation、Task、Future 五种兼容类型,最完整的值类型全家桶 |
| Zion | Maybe、List、Map、Reader、Step 及多态函数 |
| List in JS | 功能齐全的链表类型,覆盖 9 种代数 |
⚙️ 解析器组合子(Parser Combinators)
| 库 | 特点 |
|---|---|
| Parsimmon | 解析器即半群 + 函子 + 单代,语法清晰 |
| Bennu | Parsec 风格的解析器组合子 |
| Akh | 单代转换器(Monad Transformer)与常用结构合集 |
🌊 响应式与流(FRP / Stream)
| 库 | 特点 |
|---|---|
| Most.js | 流上的 Monoid、Functor、Applicative、Monad |
| bacon.js | 为 EventStream 和 Property 提供 Monad 与 Functor |
| SodiumFRP | 流的 Functor + Monoid,单元(Cell)的 Monad + Comonad |
🔷 TypeScript 与其他生态
| 库 | 特点 |
|---|---|
| TsMonad | 面向 TypeScript 的常用单代实现 |
| Monastic | 兼容 Fantasy Land 3 的 State 单代 |
| Ramda Adjunct | 社区维护的 Ramda 扩展函数库 |
🧰 工具与辅助
| 库 | 特点 |
|---|---|
| Fantasy Sorcery | 针对 FL 结构的常用高阶函数 |
| sweet-fantasies | 为半群与单代提供语法糖宏 |
| aljebra | 移植自 Haskell 的常用半群结构 |
| supervis.es | 内含大量实现 Monad 的结构 |
| lz | 惰性数组与字符串的半群/单代 |
| purify | 实现 Functor、Monad 及大量其他 FL 接口 |
另外,ECMAScript 5 的 Array 本身也天然是一个 Semigroup、Functor 与 Foldable——连语言标准都是"居民" 😄
新手上手路线:三步读懂这个仓库
- 读规范正文:从 README.md 的 "Algebras" 一节开始,每个代数都很短(类型签名 + 定律 + 方法说明),建议从 Functor → Apply → Applicative → Chain → Monad 这条主线读起。
- 看方法名清单:names 仅 23 行,是理解整个规范的最小切面;对照 index.d.ts 可以看到每个导出的方法名常量。
- 查实现列表:implementations.md 按字母列出全部兼容库及其实现的代数,选型时直接查阅即可。
贡献者指南也值得一看:CONTRIBUTING.md 说明了新增类型类后如何运行generate-js、generate-ts、generate-es脚本(对应 scripts/ 目录)重新生成导出文件。
为什么值得关注这份规范?
- 零依赖:整个"库"只是一个方法名映射(index.js),无任何运行时负担
- 互操作性:一次实现,处处可用——写解析器时可直接消费 Fluture 的异步结果,用 Folktale 的 Maybe 时也能被 Sanctuary 的函数处理
- 定律即文档:每种代数都附带必须满足的定律,实现正确性有据可查
如果你在寻找一个让 JavaScript 函数式编程各库"说同一种语言"的标准,Fantasy Land 就是答案 🎯
【免费下载链接】fantasy-landSpecification for interoperability of common algebraic structures in JavaScript项目地址: https://gitcode.com/gh_mirrors/fa/fantasy-land
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考