Fantasy Land 实现生态大赏:Sanctuary、Fluture、Folktale 等 20+ 库对比
2026/9/19 3:42:14 网站建设 项目流程

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)解决的是一个很实际的问题:

不同库各自实现了mapchainof等概念,方法名却五花八门,导致库与库之间无法互相消费对方的数据结构。

Fantasy Land 的方案非常巧妙:为 23 个标准行为规定统一的方法名(如fantasy-land/mapfantasy-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 中导出供库使用。按"代数"分组后,新手更容易理解:

分组方法名通俗理解
相等与序equalslte比较两个值是否相等 / 谁更小
组合composeid函数/箭头的组合与恒等
结合与单位元concatemptyinvert合并两个值、空值、取逆元
映射与变换mapcontramapbimappromap在容器内部施加函数变换
应用apof把"容器中的函数"应用到"容器中的值"
选择与回退altzerofilter二选一、空选择、条件过滤
遍历与折叠reducetraverse逐个消费、跨容器遍历
串接与递归chainchainRec嵌套容器摊平、尾递归安全的迭代
扩展与提取extendextract基于整个容器计算新值、取出值

完整的类型签名与定律(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 五种兼容类型,最完整的值类型全家桶
ZionMaybe、List、Map、Reader、Step 及多态函数
List in JS功能齐全的链表类型,覆盖 9 种代数

⚙️ 解析器组合子(Parser Combinators)

特点
Parsimmon解析器即半群 + 函子 + 单代,语法清晰
BennuParsec 风格的解析器组合子
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——连语言标准都是"居民" 😄

新手上手路线:三步读懂这个仓库

  1. 读规范正文:从 README.md 的 "Algebras" 一节开始,每个代数都很短(类型签名 + 定律 + 方法说明),建议从 Functor → Apply → Applicative → Chain → Monad 这条主线读起。
  2. 看方法名清单:names 仅 23 行,是理解整个规范的最小切面;对照 index.d.ts 可以看到每个导出的方法名常量。
  3. 查实现列表:implementations.md 按字母列出全部兼容库及其实现的代数,选型时直接查阅即可。

贡献者指南也值得一看:CONTRIBUTING.md 说明了新增类型类后如何运行generate-jsgenerate-tsgenerate-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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询