为什么Setter有Traversable约束?

sna*_*nak 6 haskell haskell-lens

当你查看settingin lens-family-corepackage 时,你会发现它的类型是Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b,并且Identical定义为class (Traversable f, Applicative f) => Identical f

我理解它需要ApplicativeandIdentical因为它使用pureand extract,但我不确定为什么它需要Traversable

setting :: Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b
setting sec f = pure . sec (extract . f)
Run Code Online (Sandbox Code Playgroud)

我还发现Setterlens包中Traversable通过 进行了约束Settable。所以我想二传手Traversable一般都需要。

Traversable为什么一般需要二传手?

lef*_*out 4

Setter 并不真正需要Traversable,但实际上您无论如何都强制执行此约束,因为Identical/Settable是只允许平凡实例的类。即,或者Identity与它同构的东西,并且所有这些显然也是可遍历的。

注意你总是可以写

idenTraverse :: (Identical t, Applicative g) => (a -> g b) -> t a -> g (t b)
idenTraverse f = fmap pure . f . extract
Run Code Online (Sandbox Code Playgroud)

这相当于标准traverse。(其实这只是需要Functor g,顺便说一句。)

明确要求标准Traversable接口可以实现更清晰、更一致的层次结构,而无需实际更改您可以使用设置器执行的操作或不能执行的操作。