展示 hylo 和 hyloM 之间的关系
Exhibiting the relationship between hylo and hyloM
有人告诉我以下功能在功率上是等效的
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 几乎是正确的,但是 g 是 Traversable
而不是 Functor
,而且我尝试了多种从 hylo 到 hyloM 的方法但没有成功。
这些是同构的,或者至少在功率上相似吗?如果是,我如何证明?
您可以通过实例化 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 :: 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 几乎是正确的,但是 g 是 Traversable
而不是 Functor
,而且我尝试了多种从 hylo 到 hyloM 的方法但没有成功。
这些是同构的,或者至少在功率上相似吗?如果是,我如何证明?
您可以通过实例化 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))
我不确定反过来。