2016-05-29 35 views
6

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?

+0

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 /). –

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;) –