1

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

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获取折叠为 this 的树OnlySum {value = 34}

问题是:Foldable 如何知道传递给的函数的返回类型mempty以及mappend取决于f传递给的函数的定义foldMap它是推断它还是 Haskell 有办法自动知道哪个是定义?

4

1 回答 1

3

foldMap 的定义中,我们看到它需要一个类型类实例Monoid m。所以 Haskell 知道这mappend是来自Monoid. 将推断特定类型,然后Monoid基于该类型解析类型类实例,并且将使用该类型类。

于 2014-10-14T20:24:54.317 回答