1

我被告知以下功能在功率上是等效的

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

但是,对于我的生活,我无法弄清楚如何证明这一点。在 hyloM 中将 Monad 设置为 Identity 几乎是正确的,但 gTraversable不是Functor,我尝试了多种方法从 hylo 到 hyloM,但均未成功。

这些是同构的,还是至少在力量上相似?如果是这样,我如何证明这一点?

4

1 回答 1

3

您可以通过实例化来定义hyloMusing 。hylof = Compose m g

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))

我不确定反过来。

于 2018-11-30T02:11:06.647 回答