foldr
e foldMap
possono essere utilizzati per definirsi a vicenda come ho capito. Ma com'è possibile, visto che quest'ultimo usa i monoidi, mentre il primo no? Abbiamo qualche garanzia che le cose su cui funziona foldr
possano avere un monoide?Come foldMap può fare lo stesso di foldr quando quest'ultimo non ha nulla a che fare con i monoidi?
Q
Come foldMap può fare lo stesso di foldr quando quest'ultimo non ha nulla a che fare con i monoidi?
6
A
risposta
6
foldr :: (a -> b -> b) -> b -> [a] -> b
noti che a -> b -> b
è a -> (b -> b)
. Le funzioni b -> b
formano un monoide in composizione.
Si noti come questo assomiglia
foldMap :: (..omitted..) => (a -> m) -> f a -> m
L'unica differenza è che foldMap non usa l'argomento di tipo b
di fold
"zero" e restituisce un m
, che in termini di foldr
sarebbe b->b
. Ora basta applicare l'uno all'altro e hai recuperato foldr
da foldMap
.
+0
Grazie per aver corretto l'errore di battitura;) –
Si potrebbe voler leggere [Tom Ellis '"Di cosa è' foldr' fatto? "] (Http://web.jaguarpaw.co.uk/~tom/blog/posts/2012-11-04-what -is-foldr-made-of.html) e [La risposta di Brent Yorgey "' foldr' è fatta di monoidi "] (https://byorgey.wordpress.com/2012/11/05/foldr-is-made-of -monoids /). –