About a year back I posted a field guide of recursion schemes on this blog and then lost it a few months later when I lost a couple of months of blog entries to a [crash](http://comonad.com/reader/2008/still-alive/). I recently recovered the table of recursion schemes from the original post thanks to [Google Reader](http://www.google.com/reader/)'s long memory and the help of Jeff Cutsinger.

The following recursion schemes can be found in [category-extras](http://hackage.haskell.org/cgi-bin/hackage-scripts/package/category-extras), along with variations on the underlying themes, so this should work as a punch-list.

<table border="1"><tbody><tr><th colspan="3">Folds</th></tr><tr><th>Scheme</th><th>Code</th><th>Description</th></tr><tr><td><a href="http://knol.google.com/k/edward-kmett/catamorphisms/">catamorphism</a>†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Cata.hs">Cata</a></td><td>tears down a structure level by level</td></tr><tr><td>paramorphism*†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Para.hs">Para</a></td><td>tears down a structure with primitive recursion</td></tr><tr><td>zygomorphism*†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Zygo.hs">Zygo</a></td><td>tears down a structure with the aid of a helper function</td></tr><tr><td>histomorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Histo.hs">Histo</a></td><td>tears down a structure with the aid of the previous answers it has given.</td></tr><tr><td>prepromorphism*†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Prepro.hs">Prepro</a></td><td>tears down a structure after repeatedly applying a natural transformation</td></tr><tr><th colspan="3">Unfolds</th></tr><tr><th>Scheme</th><th>Code</th><th>Description</th></tr><tr><td>anamorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Ana.hs">Ana</a></td><td>builds up a structure level by level</td></tr><tr><td>apomorphism*†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Apo.hs">Apo</a></td><td>builds up a structure opting to return a single level or an entire branch at each point</td></tr><tr><td>futumorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Futu.hs">Futu</a></td><td>builds up a structure multiple levels at a time</td></tr><tr><td>postpromorphism*†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Postpro.hs">Postpro</a></td><td>builds up a structure and repeatedly transforms it with a natural transformation</td></tr><tr><th colspan="3">Refolds</th></tr><tr><th>Scheme</th><th>Code</th><th>Description</th></tr><tr><td>hylomorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Hylo.hs">Hylo</a></td><td>builds up and tears down a virtual structure</td></tr><tr><td>chronomorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Chrono.hs">Chrono</a></td><td>builds up a virtual structure with a futumorphism and tears it down<br>with a histomorphism</td></tr><tr><td>synchromorphism</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Synchro.hs">Synchro</a></td><td>a high level transformation between data structures using a third data structure to queue intermediate results</td></tr><tr><td>exomorphism</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Exo.hs">Exo</a></td><td>a high level transformation between data structures from a trialgebra to a bialgebraga</td></tr><tr><td>metamorphism</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Meta/Erwig.hs">Erwig</a></td><td>a hylomorphism expressed in terms of bialgebras</td></tr><tr><td>metamorphism</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Meta/Gibbons.hs">Gibbons</a></td><td>A fold followed by an unfold; change of representation</td></tr><tr><td>dynamorphism†</td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Morphism/Dyna.hs">Dyna</a></td><td>builds up a virtual structure with an anamorphism and tears it down with a histomorphism</td></tr><tr><td><a href="http://arxiv.org/abs/cs/0609040">Elgot algebra</a></td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Functor/Algebra/Elgot.hs">Elgot</a></td><td>builds up a structure and tears it down but may shortcircuit the process during construction</td></tr><tr><td><a href="http://comonad.com/reader/2008/elgot-coalgebras/">Elgot coalgebra</a></td><td><a href="http://comonad.com/haskell/category-extras/src/Control/Functor/Algebra/Elgot.hs">Elgot</a></td><td>builds up a structure and tears it down but may shortcircuit the process during deconstruction</td></tr></tbody></table>

\* This gives rise to a family of related recursion schemes, modeled in category-extras with distributive law combinators  
† The scheme can be generalized to accept one or more F-distributive (co)monads.
