-
组合性 Haskell 将函数视为态射,类型为对象,强调用组合(
.)、点免费风格、fmap(Functor)、>>=(Monad)、>>>/***(Arrow)等原语,把小组件串联成大系统。Monad 的 Kleisli 组合本身构成一个范畴,流操作也能像函数组合或管道那样连接,因而代码高度模块化、可推理。 -
惰性求值 非严格求值使得计算延迟到真正需要时才发生,支持无限数据结构和递归定义(如
fix的不动点组合子),而不会立即发散。惰性天然保证引用透明,使等式推理可行,也与范畴论中先定义态射关系再“求值”以获得结果的思路相契合。 -
抽象代数结构 类型类直接对应数学结构或范畴概念:
- Monoid(单对象范畴)——列表拼接、数值加乘等;
- Functor/Applicative/Monad ——范畴论函子及其扩展;
- Arrow ——范畴上的特殊函子;
- Foldable/Traversable ——极限与共极限的程序化。 严格遵守 Monoid、Monad 等定律,使得高层重构安全且无需关心底层细节。
总之,Haskell 以纯函数与不可变数据为基石,“函数=态射、类型=对象”的对应自然而然;类型类提供高阶抽象,惰性与组合性让程序更贴近数学描述。学范畴论可助深刻理解 Haskell,实践 Haskell 亦能加深对范畴论思想的体会。