Awesome Recursion Schemes
A curation of useful resources for learning about and using recursion
schemes.
Recursion schemes are simple, composable combinators, that automate the
process of traversing and recursing through nested data structures.
Contents
Introductions
-
Awesome Recursion Schemes
- A curation of useful resources for learning about and using recursion
schemes.
-
Practical Recursion Schemes
- Introduction to pattern functors, fix points, anamorphisms,
catamorphisms, paramorphisms and hylomorphisms, requiring very little
prior knowledge.
-
An Introduction to Recursion Schemes
- Three-part series in which you discover recursion schemes from scratch
and implement a small subset of Edward Kmett’s library.
-
Understanding Algebras
- Bartosz Milewski explains F-algebras and shows how to use them in the
context of catamorphisms.
-
Recursion Schemes in JavaScript and Flow
- Series introducing recursion schemes and related concepts in
JavaScript, aimed at developers with a minimal functional programming
background.
Articles
-
Recursion Schemes: A Field Guide (Redux)
- List of various recursion schemes with code samples.
-
Catamorphisms -
Definition on the Haskell Wiki.
-
Catamorphisms
- Short definition with code on School of Haskell by Edward Kmett.
-
Rotating Squares -
Using a hylomorphism to rotate a quadtree by Jared Tobin.
-
Recursion Schemes, Part V: Hello, Hylomorphisms
-
Promorphisms, Pre and Post
- Practical examples of pre- and postpromorphisms by Jared Tobin.
-
Time Traveling Recursion Schemes
- Exploring histo and futu by example by Jared Tobin.
-
Recursion Schemes, Part IV: Time is of the Essence
- Practical article about histomorphism and the futumorphism.
-
Cheat Sheet
- Map of various recursion schemes and their duals.
-
Correcting the Visitor pattern
- Showing that the Visitor pattern implements an f-algebra for use with
a catamorphism (in Java).
-
Recursion Schemes in Scala
- Introduces the fixpoint combinator, anamorphism, catamorphism,
hylomorphism, paramorphism, apomorphism, histomorphism, dynamorphism and
futumorphism.
-
What’s in a Fold: The Basic Catamorphism in recursion-schemes
- Introduces catamorphism as a generalization of fold.
Hylomorphisms in the Wild
Articles by Bartosz Milewski about solving small, practical problems by
applying a hylomorphism.
Papers
-
Functional Programming with Bananas, Lenses, Envelopes and Barbed
Wire, 1991, Meijer et al.
- The original paper most of this is based on.
-
A Duality of Sorts, 2013, Hinze et al.
- Shows that many basic sorting algorithms exist as a pair, and that
these pairs arise naturally out of the duality between folds and
unfolds.
-
Sorting with Bialgebras and Distributive Laws, 2012, Hinze et al.
- Shows how paramorphisms and apomorphisms can be used for more
efficient implementations of sorting algorithms.
-
Scrap your boilerplate: a practical design pattern for generic
programming, 2003, SPJ et al.
- Design pattern for writing programs that traverse data structures
built from rich mutually-recursive data types.
Presentations
Cheat Sheets
Podcasts
Implementations
-
recursion-schemes
for Haskell - The canonical implementation by Edward Kmett.
-
Matryoshka for
Scala using Scalaz - Generalized folds, unfolds, and traversals for
fixed point data structures.
-
andyscott/droste for
Scala using Cats - Generalized folds, unfolds, and traversals for fixed
point data structures.
-
recursion_schemes
for Idris, based off Edward Kmett’s Haskell library.
-
purescript-matryoshka
for PureScript - Work-in-process port of matryoshka.
-
recursion for ATS -
Demonstration of recursion schemes in ATS.
-
dada for Dhall - a library
for recursion schemes in Dhall.
-
static-land-recursion-schemes
for JavaScript/Flow - Schemes for data structures written in the style
of
flow-static-land.
-
Katalyst for Kotlin - a
re-envisioning based off Matryoshka using lightweight higher kinded
polymorphism.
License
This content is licensed under
CC0.