W LYAH, jest kawałek kodu, który wygląda tak.W jaki sposób Foldable.foldl działa na Num a =>
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
ghci> F.foldl (+) 0 testTree
42
ghci> F.foldl (*) 1 testTree
64800
O ile mi wiadomo, foldMap
jest typu foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
, ale sama w sobie nie jest Num a => a
typu Monoid
, więc zastanawiam się w jaki sposób Foldable.foldl
faktycznie tu pracować? A ponieważ foldMap
nazywa się wewnętrznie przez Foldable.foldl
, jaki jest typ Monoid
?
Witam @WillemVanOnsem, dziękuję za pomoc. Właśnie o to mi chodzi, wspomniałeś o 'mempty = 1', a jaki jest typ" mempty "? Nie mogę tego całkiem zrozumieć, ponieważ w odróżnieniu od 'Sum' i' Product', 'Int' nie jest typu' Monoid' AFAIK. Czy mógłbyś wyjaśnić nieco więcej na ten temat? dzięki –
Hmm, rozumiem, jestem nowy w Haskell, myślę, że to część, której mi brakuje. Wielkie dzięki :) –
Pamiętaj, że ta sztuczka endo jest dość zaawansowana, na pewno nie jest materiałem dla początkujących. Być może łatwiej jest napisać implementację 'foldl', która najpierw konwertuje wszystkie foldery na zwykłą listę, używając' foldMap (\ x -> [x]) 'tak, aby monoid był po prostu' [a] ', a następnie robi' foldl' na liście. Jest mniej wydajny, ale prawdopodobnie łatwiejszy do zrozumienia. To może zrobić dla dobrego ćwiczenia :) – chi