Se ti interessa approfondire la teoria, ti suggerisco di leggere qualcosa su catamorphisms, anamorphisms e hylomorphisms. Mentre la teoria delle categorie che la circonda può sembrare un po 'spaventosa, il concetto non è così difficile.
I catamorfismi sono funzioni che consumano strutture dati ricorsive e producono un qualche tipo di valore.Gli anamorfismi sono funzioni che hanno un certo valore (una specie di seme) producono strutture dati ricorsive. In particolare, foldr
e build
menzionati negli altri registri sono funzioni per costruire catamorfismi e anamorfismi nelle liste. Ma questo concetto può essere applicato fondamentalmente a qualsiasi struttura dati ricorsiva, come diversi tipi di alberi ecc.
Ora se si costruisce una struttura dati ricorsiva con un anamorfismo e poi si consuma con un catamorfismo, si ottiene ciò che viene chiamato un ilemorfismo. In tal caso, in realtà non hai bisogno della struttura intermedia. Puoi saltare la creazione e distruggerlo. Questo è spesso chiamato deforestation.
Per quanto riguarda map
: Questa funzione è interessante che è sia un catamorphism e un anamorfismo:
map
consuma una lista e produce qualcosa; ma anche
map
produce una lista, consumando qualcosa.
Così si può visualizzare la composizione di due mappe map f . map g
come una composizione di un anamorfismo (map g
) con una catamorphism (map f
), formando un ilemorfismo. Quindi sai che puoi ottimizzare (deforest) non creando la lista intermedia.
essere specifici: Si potrebbe scrivere map
in due modi: una con foldr
e l'altro utilizzando build
:
mapAna :: (a -> b) -> [a] -> [b]
mapAna f xs = build (mapAna' f xs)
mapAna' :: (a -> b) -> [a] -> (b -> c -> c) -> c -> c
mapAna' f [] cons nil = nil
mapAna' f (x : xs) cons nil = (f x) `cons` (mapAna' f xs cons nil)
mapCata :: (a -> b) -> [a] -> [b]
mapCata f xs = foldr (\x ys -> f x : ys) [] xs
e la composizione map f (map g zs)
come mapCata f (mapAna g zs)
, che, dopo alcune semplificazioni e applicando foldr c n (build g) == g c n
risultati in map (f . g)
.
fonte
2012-10-29 09:17:40
si potrebbe voler postare questo sulla pagina CS teorica, anche – blueberryfields
@blueberryfields: [Theoretical Computer Science Stack Exchange] (http://cstheory.stackexchange.com/) è per TCS di livello di ricerca, che questa domanda non è 't. @Yttril: Fold è un'operazione universale (ogni azione sequenziale su una struttura di dati può essere espressa come una piega), il che suggerisce che poche di tali equazioni sono valide. – Gilles
@Giles: sì, è per questo che ero curioso di quante ottimizzazioni ci siano in realtà. – Yttrill