You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何每个Lens'都是Traversal'?对Haskell透镜教程逻辑的疑问

Lens' 与 Traversal' 的类型约束逻辑解析

先明确给出的类型定义:

type Traversal' a b = forall f . Applicative f => (b -> f b) -> (a -> f a) 
type Lens'      a b = forall f . Functor     f => (b -> f b) -> (a -> f a) 

核心逻辑在于类型约束的“覆盖范围”差异:

  • Lens' 的约束是「兼容所有 Functor 实例」。由于 Applicative 是 Functor 的子类(所有 Applicative 都自动满足 Functor 的要求),能兼容所有 Functor 的实现,自然也能兼容所有 Applicative——所以任何合法的 Lens' 都可以直接当作 Traversal' 使用。
  • Traversal' 的约束是「仅需兼容所有 Applicative 实例」,不要求兼容非 Applicative 的普通 Functor。很多 Traversal' 的实现会依赖 Applicative 独有的操作(比如 pure 或 <*>),这些是普通 Functor 没有的能力。比如遍历列表的 traverse,它需要用 Applicative 来组合多个元素的处理结果,根本没法适配到只支持 fmap 的普通 Functor 上——这类 Traversal' 显然不能作为 Lens' 使用。

举个直白的类比:

  • 能“掌握所有单人球类运动”的人,肯定能“掌握所有双人球类运动”;
  • 但只会“所有双人球类运动”的人,不一定会单人球类运动——反过来的逻辑不成立。

内容的提问来源于stack exchange,提问作者cobra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:32:37