Итак, я изучал Haskell за последние несколько месяцев, и я наткнулся на пример Monoids, который меня озадачил
Учитывая эти определения
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
И это дерево:
testTree = Node 5
(Node 3
(Node 1 Empty Empty)
(Node 6 Empty Empty)
)
(Node 9
(Node 8 Empty Empty)
(Node 10 Empty Empty)
)
Если я запустил:
ghci> F.foldl (+) 0 testTree
42
ghci> F.foldl (*) 1 testTree
64800
Как ghci знает, что Monoid может использовать для mappend при его складывании, потому что по умолчанию числа в дереве являются только классом Num, и мы никогда явно не говорили о том, где некоторые моноиды, такие как Sum или Product, So как ghci выводит правильный моноид? или я полностью ушел в этот момент
Пример источника: http://learnyouahaskell.com/functors-applicative-functors-and-monoids#monoids