Si le interesa profundizar en la teoría, le sugiero que lea algo sobre catamorphisms, anamorphisms y hylomorphisms. Si bien la teoría de categorías que lo rodea puede parecer un poco aterradora, el concepto no es tan difícil.
Los catamorfismos son funciones que consumen estructuras de datos recursivas y producen algún tipo de valor.Los anamorfismos son funciones que, dado algún valor (una especie de semilla) producen estructuras de datos recursivas. En particular, foldr
y build
mencionados en las otras torres son funciones para construir catamorfismos y anamorphisms en listas. Pero este concepto se puede aplicar básicamente a cualquier estructura de datos recursiva, como diferentes tipos de árboles, etc.
Ahora, si construyes una estructura recursiva de datos con un anamorfismo y luego la consumes con un catamorfismo, obtienes lo que se llama hylomorphism. En tal caso, en realidad no necesita la estructura intermedia. Puedes saltarte la creación y la destrucción. Esto a menudo se llama deforestation.
En cuanto map
: Esta función es interesante que es a la vez un catamorphism y una anamorfosis:
map
consume una lista y produce algo; pero también
map
produce una lista, consumiendo algo.
Así se puede ver la composición de los dos mapas map f . map g
como una composición de una anamorfosis (map g
) con un catamorphism (map f
), formando una hilomorfismo. Por lo tanto, puede optimizar (deforestar) al no crear la lista intermedia.
Para ser más específicos: Se puede escribir map
de dos maneras, uno con foldr
y la otra usando 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
y la composición map f (map g zs)
como mapCata f (mapAna g zs)
, que después de algunas simplificaciones y aplicando foldr c n (build g) == g c n
resultados en map (f . g)
.
es posible que desee publicar esto en la página CS teórica, también – blueberryfields
@blueberryfields: [Intercambio de pila de informática teórica] (http://cstheory.stackexchange.com/) es para TCS de nivel de investigación, que esta pregunta no es posible. 't. @Yttril: Fold es una operación universal (cada acción secuencial en una estructura de datos se puede expresar como un doblez), lo que sugiere que pocas de esas ecuaciones se mantienen. – Gilles
@Giles: sí, es por eso que estaba curioso sobre cuántas optimizaciones hay en realidad. – Yttrill