我正在学习通过学习你一个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 ) –