我正在“ 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 有办法自动知道哪个是定义?