我有一个数据类型和附带的函数,看起来非常像某种遍历。下面是一个简化的例子:
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,因为applicative中的结果类型不必与输入类型完全相同,也不是来自Traversable的traverse,因为传入的函数需要知道Bar,尽管它不在类型参数中。
发布于 2019-09-05 03:14:41
镜片包装会将其称为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)https://stackoverflow.com/questions/57794397
复制相似问题