Foldable如何知道mappend的实现

时间:2014-10-14 20:15:00

标签: haskell monoids foldable

我正在“http://learnyouahaskell.com”的帮助下学习Haskell。我正在关注作为Foldable的实例的BST(二进制搜索树)的示例:

data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)

instance F.Foldable Tree where
    foldMap f Nil = mempty
    foldMap f (Node x l r) = (F.foldMap f l) `mappend` (f x) `mappend` (F.foldMap f r)

当我运行F.foldMap (\x -> [x]) testTree时,我得到一个代表折叠树的列表。 我实现了自己的数据类型:

newtype OnlySum a = OnlySum {value :: a} deriving (Eq, Ord, Read, Show, Bounded)
instance Num a => Monoid (OnlySum a) where
    mempty = OnlySum 0
    OnlySum x `mappend` OnlySum y = OnlySum (x + y)

并运行此命令:F.foldMap (\x -> OnlySum x) testTree以获取折叠为OnlySum {value = 34}的树。

问题是: Foldable如何知道memptymappend的定义,具体取决于传递给f的函数foldMap的返回类型?< / strong>它是否推断它或是否有办法让Haskell自动知道哪个是定义?

1 个答案:

答案 0 :(得分:3)

definition of foldMap中,我们发现它需要一个类型类实例Monoid m。所以Haskell知道mappend来自Monoid。将推断出特定类型,然后基于该类型解析Monoid类型类实例,并且该类型类将被使用。