# Awesome Recursion Schemes [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) > 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](#introductions) - [Articles](#articles) - [Papers](#papers) - [Presentations](#presentations) - [Cheat Sheets](#cheat-sheets) - [Podcasts](#podcasts) - [Implementations](#implementations) ## Introductions - [Awesome Recursion Schemes](https://github.com/passy/awesome-recursion-schemes) - A curation of useful resources for learning about and using recursion schemes. - [Practical Recursion Schemes](https://jtobin.io/practical-recursion-schemes) - Introduction to pattern functors, fix points, anamorphisms, catamorphisms, paramorphisms and hylomorphisms, requiring very little prior knowledge. - [An Introduction to Recursion Schemes](http://blog.sumtypeofway.com/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](https://www.schoolofhaskell.com/user/bartosz/understanding-algebras) - Bartosz Milewski explains F-algebras and shows how to use them in the context of catamorphisms. - [Recursion Schemes in JavaScript and Flow](https://medium.com/@JosephJnk/recursion-schemes-in-javascript-and-flow-with-static-land-recursision-schemes-97cf10599fb7) - 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)](http://comonad.com/reader/2009/recursion-schemes/) - List of various recursion schemes with code samples. - [Catamorphisms](https://wiki.haskell.org/Catamorphisms) - Definition on the Haskell Wiki. - [Catamorphisms](https://www.schoolofhaskell.com/user/edwardk/recursion-schemes/catamorphisms) - Short definition with code on School of Haskell by Edward Kmett. - [Rotating Squares](https://jtobin.io/rotating-squares) - Using a hylomorphism to rotate a quadtree by Jared Tobin. - [Recursion Schemes, Part V: Hello, Hylomorphisms](http://blog.sumtypeofway.com/recursion-schemes-part-v/) - [Promorphisms, Pre and Post](https://jtobin.io/promorphisms-pre-post) - Practical examples of pre- and postpromorphisms by Jared Tobin. - [Time Traveling Recursion Schemes](https://jtobin.io/time-traveling-recursion) - Exploring histo and futu by example by Jared Tobin. - [Recursion Schemes, Part IV: Time is of the Essence](http://blog.sumtypeofway.com/recursion-schemes-part-iv-time-is-of-the-essence/) - Practical article about histomorphism and the futumorphism. - [Cheat Sheet](https://github.com/sellout/recursion-scheme-talk/blob/master/cheat%20sheet.pdf) - Map of various recursion schemes and their duals. - [Correcting the Visitor pattern](http://logji.blogspot.co.uk/2012/02/correcting-visitor-pattern.html) - Showing that the Visitor pattern implements an f-algebra for use with a catamorphism (in Java). - [Recursion Schemes in Scala](https://free.cofree.io/2017/11/13/recursion/) - Introduces the fixpoint combinator, anamorphism, catamorphism, hylomorphism, paramorphism, apomorphism, histomorphism, dynamorphism and futumorphism. - [What's in a Fold: The Basic Catamorphism in recursion-schemes](https://duplode.github.io/posts/whats-in-a-fold.html) - Introduces catamorphism as a generalization of fold. ### Hylomorphisms in the Wild Articles by Bartosz Milewski about solving small, practical problems by applying a hylomorphism. - [Stalking a Hylomorphism in the Wild](https://bartoszmilewski.com/2017/12/29/stalking-a-hylomorphism-in-the-wild/) - Advent of Code 2017, Domino challenge - [Open Seasons on Hylomorphisms](https://bartoszmilewski.com/2018/12/20/open-season-on-hylomorphisms/) - Advent of Code 2018, String comparison challenge ## Papers - [Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire, 1991, Meijer et al.](http://maartenfokkinga.github.io/utwente/mmf91m.pdf) - The original paper most of this is based on. - [A Duality of Sorts, 2013, Hinze et al.](http://www.cs.ox.ac.uk/ralf.hinze/publications/Sorting.pdf) - 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.](http://www.cs.ox.ac.uk/people/daniel.james/sorting/sorting.pdf) - 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.](http://research.microsoft.com/en-us/um/people/simonpj/Papers/hmap/hmap.ps) - Design pattern for writing programs that traverse data structures built from rich mutually-recursive data types. ## Presentations - [Slidedecks by Tim Philip Williams](http://www.timphilipwilliams.com/slides.html) - "Recursion Schemes by Example" and "Exotic Tools for Exotic Trades" provide concise definitions as well as practical examples of many recursion schemes. - [Unifying Structured Recursion Schemes](https://www.youtube.com/watch?v=9EGYSb9vov8) - 12 min presentation by Ralf Hinze, Nicolas Wu, and Jeremy Gibbons. - [Recursion Schemes](https://www.youtube.com/watch?v=Zw9KeP3OzpU) - Presented by Tim Williams at the London Haskell meetup. - [F-algebras or: How I Learned to Stop Worrying and Love the Type System](https://www.youtube.com/watch?v=PK4SOaAGVfg) - Presented by Anthony Burzillo at the NYC Haskell User's Group. - [A Gentle Introduction to Recursion Schemes](https://www.youtube.com/watch?v=i5A2Amfcir8) - Presented by Jean Remi Desjardins at Lambdaconf 2016. - [recursion-scheme-talk](https://github.com/sellout/recursion-scheme-talk) - Collection of slide decks about recursion schemes. - [Bracer: Transforming Real-World Languages with Coproducts and Recursion Schemes](https://www.youtube.com/watch?v=5Kr7IykGMzU) - High-level talk about structuring programs with coproducts and recursion schemes by Patrick Thomson. - [Recursion: Where Functional Programming Hits Bottom](https://www.youtube.com/watch?v=24UoRaoKLjM) - Introduction to recursive fix point data structures and recursion schemes in Haskell and Scala by Greg Pfeil. - [Programming with algebras](https://www.youtube.com/watch?v=-98fR9VmLbQ) - Bartosz Milewski's article in talk form, presented at LambdaCon. - [Peeling the Banana: Recursion Schemes from First Principles](https://www.youtube.com/watch?v=XZ9nPZbaYfE&t=3s) - Zainab Ali's Introductory talk presented at LambdaWorld. ## Cheat Sheets - [The Hitchhiker's Guide to Morphisms](https://ipfs.io/ipfs/QmTppu1VDAQWsdiyVSZX6qb8PErdpwzNP2oKfEhcgaBvWR/guide-to-morphisms.pdf) - Overview of different morphisms including a printable PDF. ## Podcasts - [Magic Read Along](http://www.magicreadalong.com/) - Casual discussions about category theory that often bring up recursion schemes, including [episode 33](http://www.magicreadalong.com/episode/33) which talks about Histomorphisms and Futumorphisms. - [Scala Love](https://scala.love/) - Podcast about Scala that brings up recursion schemes in [the second episode](https://scala.love/happy-valentin/). - [The Haskell Cast](https://www.haskellcast.com/) - Recursion schemes come up in [Episode 13 with John Wiegley](https://www.haskellcast.com/episode/013-john-wiegley-on-categories-and-compilers). ## Implementations - [recursion-schemes](https://github.com/ekmett/recursion-schemes/) for Haskell - The canonical implementation by Edward Kmett. - [Matryoshka](https://github.com/slamdata/matryoshka) for Scala using Scalaz - Generalized folds, unfolds, and traversals for fixed point data structures. - [andyscott/droste](https://github.com/andyscott/droste) for Scala using Cats - Generalized folds, unfolds, and traversals for fixed point data structures. - [recursion\_schemes](https://github.com/vmchale/recursion_schemes/) for Idris, based off Edward Kmett's Haskell library. - [purescript-matryoshka](https://github.com/slamdata/purescript-matryoshka) for PureScript - Work-in-process port of matryoshka. - [recursion](https://github.com/vmchale/recursion) for ATS - Demonstration of recursion schemes in ATS. - [dada](https://github.com/sellout/dada) for Dhall - a library for recursion schemes in Dhall. - [static-land-recursion-schemes](https://github.com/JosephJNK/static-land-recursion-schemes) for JavaScript/Flow - Schemes for data structures written in the style of [flow-static-land](https://github.com/gcanti/flow-static-land). - [Katalyst](https://github.com/aedans/Katalyst) for Kotlin - a re-envisioning based off Matryoshka using lightweight higher kinded polymorphism. ## License This content is licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/).