Мне сказали, что следующие функции эквивалентны по мощности
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
Однако, убей меня, я не могу понять, как это продемонстрировать. Установка Monad в Identity в hyloM — это почти правильно, но g — это Traversable
, а не Functor
, и я пробовал несколько подходов для перехода от hylo к hyloM, но безуспешно.
Являются ли они изоморфными или, по крайней мере, схожими по силе? Если да, то как мне это доказать?