簡體   English   中英

這總是如此:fmap(foldr fz)。 sequenceA = foldr(liftA2 f)(純z)

[英]Is this always true: fmap (foldr f z) . sequenceA = foldr (liftA2 f) (pure z)

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)

我強烈懷疑左右表達是否相等,但如何證明呢?

這至少是一個開始:

\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 fmap toList . sequenceA = sequenceA . toList fmap toList . sequenceA = sequenceA . toList ,並且你的原始聲明適用於t = []你應該很高興去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM