March 25, 2017

This is a reformatted version of Fantasyland Institute of Learning's *Standardized Ladder of Functional Programming*, released under CC BY-NC 4.0, and available at lambdaconf.us/downloads/documents/lambdaconf_slfp.pdf.

Concepts | Skills |
---|---|

Immutable Data | Use second-order functions (map, filter, fold) on immutable data structures |

Second-Order Functions | Destructure values to access their components |

Constructing & Destructuring | Use data types to represent optionality |

Function Composition | Read basic type signatures |

First-Class Functions 8, Lambdas | Pass lambdas to second-order functions |

Concepts | Skills |
---|---|

Algebraic Data Types | Solve problems without nulls, exceptions, or type casts |

Pattern Matching | Process 8, transform recursive data structures using recursion |

Parametric Polymorphism | Able to use functional programming in the small |

General Recursion | Write basic monadic code for a concrete monad |

Type Classes, Instances, 8, Laws | Create type class instances for custom data types |

Lower-Order Abstractions (Equal, Semigroup, Monoid, etc) | Model a business domain with ADTs |

Referential Transparency 8, Totality | Write functions that take and return functions |

Higher-Order Functions | Reliably identify 8, isolate pure code from impure code |

Partial-Application, Currying, & Point-Free Style | Avoid introducing unnecessary lambdas & named parameters |

Concepts | Skills |
---|---|

Generalized Algebraic Data Types | Able to use functional programming 'in the large' |

Higher-Kinded Types | Test code using generators and properties |

Rank-N Types | Write imperative code in a purely functional way through monads |

Folds & Unfolds | Use popular purely functional libraries to solve business problems |

Higher-Order Abstractions (Category, Functor, Monad) | Separate decision from effects |

Basic Optics | Write a simple custom lawful monad |

Efficient Persistent Data Structures | Write production medium-sized projects |

Existential Types | Use lenses 8„ prisms to manipulate data |

Embedded DSLs using Combinators | Simplify types by hiding irrelevant data with existentials |

Concepts | Skills |
---|---|

Cochota | Design a minimally-powerful monad transformer stock |

(Co)Recursion Schemes | Write concurrent and streaming programs |

Advanced Optics | Use purely functional mocking in tests |

Dual Abstractions (Comonad) | Use type classes to modularly model different effects |

Monad Transformers | Recognize type patterns 8, abstract over them |

Free Monads & Extensible Effects | Use functional libraries in novel ways |

Functional Architecture | Use optics to manipulate state |

Advanced Functors (Exponential, Profunctors, Contravariant) | Write custom lawful monad transformers |

Embedded DSLs using GADTs, Finally 'fogless | Use free monads I extensible effects to separate concerns |

Advanced Monads (Continuation, Logic) | Encode invariants at the type level |

Type Families, Functional Dependencies | Effectively use FDs I type families to create safer code |

Concepts | Skills |
---|---|

High-Performance | Design a generic, lawful library with broad appeal |

Kind Polymorphism | Prove properties manually using equational reasoning |

Generic Programming | Design 8, implement a new functional programming language |

Type-Level Programming | Create novel abstractions with laws |

Dependent-Types, Singleton Types | Write distributed systems with certain guarantees |

Category Theory | Use proof systems to formally prove properties of code |

Graph Reduction | Create libraries that do not permit invalid states |

Higher-Order Abstract Syntax | Use dependent-typing to prove more properties at compile-time |

Compiler Design for Functional Languages | Understand deep relationships between different concepts |

Profunctor Optics | Profile, debug. & optimize purely functional code with minimal sacrifices |