每个镜头都是一次穿越……怎么样?

cob*_*bra 10 haskell functor applicative haskell-lens

Control.Lens.Tutorial说:

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) 
Run Code Online (Sandbox Code Playgroud)

请注意,Lens' 和 Traversal' 之间的唯一区别是类型类约束。“镜头”具有函子约束,“遍历”具有应用约束。这意味着任何 Lens' 也自动成为有效的 Traversal'(因为 Functor 是 Applicative 的超类)。

我只是不遵循这里的逻辑顺序。我们知道每个Applicative都是一个Functor。由此看来,如果有的话,难道不应该得出每个Traversal'都是 a 吗Lens'?然而,本教程得出了相反的结论。

che*_*ner 15

ALens'适用于所有函子,其中包括所有应用函子,因此如果函数g是 a Lens',则g也是 a Traversal'

ATraversal'适用于所有应用函子,但不一定适用于所有函子。因此,如果一个函数h是 a Traversal',那么它不一定是 a Lens'

(我不是正式描述这一点的人,但至少对我来说,看起来这些类型在其约束中是“逆变”的。Lens'是 的子类型Traversal',正是因为 Functor是 的超类Applicative。)