2011-05-19 74 views
14
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) 

我強烈懷疑表達式左右相等,但如何證明呢?這總是如此:fmap(foldr f z)。 sequenceA = foldr(liftA2 f)(pure z)

+1

你假設所有建議的法律保留,否則我會說答案是否定的。 – augustss 2011-05-19 11:51:59

+1

是的,我假設法律適用。當證明t = []時,我需要Applicative的組合,同態和fmap規則。 – 2011-05-19 12:08:29

回答

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 

如果你能證明fmap toList . sequenceA = sequenceA . toList,那你原來的要求適用於t = []你要善於去。

+1

'fmap toList。 sequenceA = sequenceA。 toList'成立,請參閱http://patternsinfp.wordpress.com/2011/05/17/distributivity-in-horners-rule/,這篇文章引導我回答這個問題。但我希望能夠在不通過列表的情況下證明這一點。 – 2011-05-19 12:27:19

+3

實際上,想一想更多一些,使用foldr時,通過列表會很有意義。謝謝! – 2011-05-19 12:53:58