这总是如此:fmap(foldr fz).sequenceA = foldr(liftA2 f)(纯z)

Sjo*_*her 14 haskell proof

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)
Run Code Online (Sandbox Code Playgroud)

我强烈怀疑左右表达是否相等,但如何证明呢?

ham*_*mar 9

这至少是一个开始:

\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
Run Code Online (Sandbox Code Playgroud)

如果你可以证明这一点fmap toList . sequenceA = sequenceA . toList,并且你原来的主张对t = []你来说应该是好的.

  • 实际上,考虑一下它,在使用foldr时,浏览列表会很有意义.谢谢! (3认同)