我正在“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如何知道mempty
和mappend
的定义,具体取决于传递给f
的函数foldMap
的返回类型?< / strong>它是否推断它或是否有办法让Haskell自动知道哪个是定义?
答案 0 :(得分:3)
在definition of foldMap中,我们发现它需要一个类型类实例Monoid m
。所以Haskell知道mappend
来自Monoid
。将推断出特定类型,然后基于该类型解析Monoid
类型类实例,并且该类型类将被使用。