Я изучаю Haskell с помощью "http://learnyouahaskell.com". Я следую примеру 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
чтобы получить свернутое дерево как это OnlySum {value = 34}
.
Возникает вопрос: Как Foldable узнает определение mempty
и mappend
в зависимости от типа возвращаемого значения функции f
, переданной в foldMap
? Выводит ли он это или есть способ для Haskell автоматически узнать, какой Определение?