Haskell 展示了hylo和hyloM之间的关系

Haskell 展示了hylo和hyloM之间的关系,haskell,recursion-schemes,Haskell,Recursion Schemes,我听说下列函数在功率上是等价的 hylo :: Functor f => (f b -> b) -> (a -> f a) -> a -> b hylo f g = h where h = f . fmap h . g hyloM :: (Traversable g, Monad m) => (g b -> m b) -> (a -> m (g a)) -> a -> m b hyloM f g = h where h =

我听说下列函数在功率上是等价的

hylo :: Functor f => (f b -> b) -> (a -> f a) -> a -> b
hylo f g = h where h = f . fmap h . g

hyloM :: (Traversable g, Monad m) => (g b -> m b) -> (a -> m (g a)) -> a -> m b
hyloM f g = h where h = f <=< traverse h <=< g
hylo::函子f=>(fb->b)->(a->fa)->a->b
hylo f g=h,其中h=f。fmap h。G
hyloM::(可遍历的g,单子m)=>(g b->m b)->(a->m(g a))->a->m b

hyloM f g=h,其中h=f您可以通过实例化
f=Compose m g
使用
hylo
来定义
hyloM

hyloM' :: (Traversable g, Monad m) => (g b -> m b) -> (a -> m (g a)) -> a -> m b
hyloM' f g = hylo (\(Compose mg) -> mg >>= sequence >>= f) (\a -> Compose (g a))

我不确定相反的情况。

如果它们工作在不同的类型上,那么它们的功率相等意味着什么?我能理解的唯一含义是“hylo可以用hyloM实现,反之亦然,在所涉及的类型之间使用一些翻译”。我认为给出的答案加上评论显示出“几乎同构”。如果它们是完全同构的,那就太好了,但我认为hyloM需要对此进行修改。我认为相反,如果你不介意添加
可遍历的
约束,那么它要么是微不足道的(使
m~Identity
),要么是不可能的(如果你介意添加约束)。是的,如果通过遍历函数进行参数化,那么很容易将f标识交换为f标识,因此它可能只相当于“gHyloM”