我正在學習通過學習你一個Haskell,並且我正在關於monoids的部分。在本節中,作者定義了一棵樹的foldMap方法,如下所示:Foldable的foldl/foldr實現來自haskell中的二叉樹嗎?
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
哪個工作正常,完全是否成球。然而,他然後說:「現在我們有一個可摺疊的實例用於我們的樹型,我們可以免費獲得foldr和foldl!」並顯示以下代碼:
testTree = Node 5
(Node 3
(Node 1 Empty Empty)
(Node 6 Empty Empty)
)
(Node 9
(Node 8 Empty Empty)
(Node 10 Empty Empty)
)
ghci> F.foldl (+) 0 testTree
42
ghci> F.foldl (*) 1 testTree
64800
現在我很困惑。沒有一個針對Trees的foldl或foldr的實現。這些函數似乎有點像foldmap,但將初始累加器作爲樹的頭部,然後將foldMapping放在適當的monoid上,但它實際上不能像這樣工作,因爲foldl和foldr比使用更通用的函數monoids'+'和'*'作爲參數。實際上foldl和foldr在哪裏實現,它們是如何工作的,爲什麼定義foldMap會使它們存在?
你看過Data.Foldable的源代碼嗎?可摺疊類中的定義應該足以提供足夠的信息來回答你的問題。 – 2013-05-26 08:58:05
Haskell類型類可以使用其他方法對某些方法進行默認實現。在這裏它們類似於mixin如何在其他語言中工作。例如,在Ruby中,只需要定義<=>就可以訪問Comparable的其餘方法。 – danidiaz
[Foldr/Foldl免費實現摺疊摺疊圖時可能的重複?](http://stackoverflow.com/questions/23319683/foldr-foldl-for-free-when-tree-is-implementing-foldable-foldmap ) –