为何每个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
相关产品推荐
相关产品推荐

