Traversable 和 MonoTraversable 之间有什么东西吗?

Is there something in between Traversable and MonoTraversable?

我有一个数据类型和附带的函数,看起来非常像某种遍历。这是一个简化的例子:

data Foo x = MkFoo (Bar x) (Bar x)

almostTraverse :: Applicative f => (Bar a -> f (Bar b)) -> Foo a -> f (Foo b)
almostTraverse f (MkFoo x y) = MkFoo <$> f x <*> f y

假设 Bar 是某种不透明类型,不一定是函子。是否有一些类型类是 almostTraverse 的泛化?它不是 MonoTraversable 中的 otraverse,因为应用程序中的结果类型不必与输入类型完全相同,而且它也不是 Traversable 中的 traverse ,因为传入的函数需要知道 Bar 尽管它不在类型参数中。

镜头包会称之为 Traversal:

almostTraverse :: Traversal (Foo a) (Foo b) (Bar a) (Bar b)

您可以考虑创建 Each 类型类的实例,如

instance Each (Foo a) (Foo b) (Bar a) (Bar b) where
    each f (MkFoo x y) = liftA2 MkFoo (f x) (f y)