Map (higher-order function): Difference between revisions

Content deleted Content added
Optimizations: «"this simplification and" → "that is, <math>\left( m f \right) \circ \left( m g \right) = m\left( f \circ g \right) </math>. This", +"eliminates a possibly expensive second map by fusing it with the first map; thus it", "fusio
Optimizations: separate things, so add some whitrespace
Line 16:
 
==Optimizations==
The mathematical basis of maps allow for a number of [[optimization]]s. If one has <code>map f . map g</code> ('.' is function application; <code>map f (map g xs)</code> is equivalent) then it is the same as the simpler <code>map (f . g) xs</code>; that is, <math>\left( m f \right) \circ \left( m g \right) = m\left( f \circ g \right) </math>. This particular optimization eliminates a possibly expensive second map by fusing it with the first map; thus it is a "map fusion"<ref>[http://www.randomhacks.net/articles/2007/02/10/map-fusion-and-haskell-performance "Map fusion: Making Haskell 225% faster"</ref>.

Map functions can and often are defined in terms of a [[Fold (higher-order function)|fold]] such as <code>foldr</code>, which means one can do a "map-fold fusion": <code>f z . map g</code> is equivalent to <code>foldr (f . g) z</code>.
 
==Haskell's Functor class==