x--
means: I know about itxx-
means: I understand itxxx
means: I can explain it
---
Immutable Data---
Second-Order Functions---
Constructing & Destructuring---
Function Composition---
First-Class Functions & Lambdas
---
Use second-order functions (map, filter, fold) on immutable data structures---
Destructure values to access their components---
Use data types to represent optionality---
Read basic type signatures---
Pass lambdas to second-order functions
---
Algebraic Data Types---
Pattern Matching---
Parametric Polymorphism---
General Recursion---
Type Classes, Instances & Laws---
Lower-Order Abstractions (Equal, Semigroup, Monoid, etc)---
Referential Transparency & Totality---
Higher-Order Functions---
Partial-Application, Currying, & Point-Free Style
---
Solve problems without nulls, e-ceptions, or type casts---
Process & transform recursive data structures using recursion---
Able to use functional programming "in the small"---
Write basic monadic code for a concrete monad---
Create type class instances for custom data types---
Model a business domain with ADTs---
Write functions that take and return functions---
Reliably identify & isolate pure code from impure code---
Avoid introducing unnecessary lambdas & named parameters
---
Generalized Algebraic Data Types---
Higher-Kinded Types---
Rank-N Types---
Folds & Unfolds---
Higher-Order Abstractions (Category, Functor, Monad)---
Basic Optics---
Efficient Persistent Data Structures---
E-istential Types---
Embedded DSLs using Combinators
---
Able to use functional programming "in the large"---
Test code using generators and properties---
Write imperative code in a purely functional way through monads---
Use popular purely functional libraries to solve business problems---
Separate decision from effects---
Write a simple custom lawful monad---
Write production medium-sized projects---
Use lenses & prisms to manipulate data---
Simplify types by hiding irrelevant data with e-istentials
---
Codata---
(Co)Recursion Schemes---
Advanced Optics---
Dual Abstractions (Comonad)---
Monad Transformers---
Free Monads & E-tensible Effects---
Functional Architecture---
Advanced Functors (E-ponential, Profunctors, Contravariant)---
Embedded DSLs using GADTs, Finally Tagless---
Advanced Monads (Continuation, Logic)---
Type Families, Functional Dependencies
---
Design a minimally-powerful monad transformer stack---
Write concurrent and streaming programs---
Use purely functional mocking in tests---
Use type classes to modularly model different effects---
Recognize type patterns & abstract over them---
Use functional libraries in novel ways---
Use optics to manipulate state---
Write custom lawful monad transformers---
Use free monads / e-tensible effects to separate concerns---
Encode invariants at the type level---
Effectively use FDs / type families to create safer code
---
High-Performance---
Kind Polymorphism---
Generic Programming---
Type-Level Programming---
Dependent-Types, Singleton Types---
Category Theory---
Graph Reduction---
Higher-Order Abstract Synta----
Compiler Design for Functional Languages---
Profunctor Optics
---
Design a generic, lawful library with broad appeal---
Prove properties manually using equational reasoning---
Design & implement a new functional programming language---
Create novel abstractions with laws---
Write distributed systems with certain guarantees---
Use proof systems to formally prove properties of code---
Create libraries that do not permit invalid states---
Use dependent-typing to prove more properties at compile-time---
Understand deep relationships between different concepts---
Profile, debug, & optimize purely functional code with minimal sacrifices