在LYAH中,有一段代碼看起來像這樣。Foldable.foldl如何在數字a上工作=> a
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
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
ghci> F.foldl (+) 0 testTree
42
ghci> F.foldl (*) 1 testTree
64800
據我所知,foldMap
是foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
類型,但Num a => a
本身並不Monoid
型的,所以我想知道如何Foldable.foldl
實際上在這裏工作?由於foldMap
由Foldable.foldl
在內部調用,因此Monoid
的類型是什麼?
嗨@WillemVanOnsem,謝謝你的幫助。這正是我所困惑的,你提到'mempty = 1',那麼這裏的'mempty'的類型是什麼?我不太明白這一點,因爲不像'Sum'和'Product','Int'不是類型'Monoid' AFAIK。你能解釋一下這個嗎?謝謝 –
嗯,我明白了,我是Haskell的新手,我想那是我缺少的部分。非常感謝:) –
請注意,這種技巧是非常先進的,肯定不是初學者的材料。編寫一個'foldl'實現可能更容易,它首先使用'foldMap(\ x - > [x])'將任何可摺疊的元素轉換爲普通列表,然後執行''a''' foldl'在名單上。效率較低,但可能更易於理解。它可以使一個很好的鍛鍊:) – chi