在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