Всегда ли это так: fmap (foldr f z). sequenceA = foldr (liftA2 f) (чистый z) - PullRequest
14 голосов
/ 19 мая 2011
import Prelude hiding (foldr)

import Control.Applicative
import Data.Foldable
import Data.Traversable

left, right :: (Applicative f, Traversable t) => (a -> b -> b) -> b -> t (f a) -> f b
left f z = fmap (foldr f z) . sequenceA
right f z = foldr (liftA2 f) (pure z)

У меня есть сильное подозрение, что выражения слева и справа равны, но как это доказать?

1 Ответ

9 голосов
/ 19 мая 2011

Вот, по крайней мере, начало:

\f z -> fmap (foldr f z) . sequenceA
== (definition of Foldable foldr)
\f z -> fmap (foldr f z . toList) . sequenceA
== (distributivity of fmap)
\f z -> fmap (foldr f z) . fmap toList . sequenceA
== (need to prove this step, but it seems intuitive to me)
\f z -> fmap (foldr f z) . sequenceA . toList

\f z -> foldr (liftA2 f) (pure z)
== (definition of Foldable foldr)
\f z -> foldr (liftA2 f) (pure z) . toList

Если вы можете доказать, что fmap toList . sequenceA = sequenceA . toList, и что ваше первоначальное требование относится к t = [], вам следует идти.

...