[Know about it][Understanding][Clear understanding]
xxx
Immutable Dataxxx
Second-Order Functionsxxx
Constructing & Destructuringxxx
Function Compositionxxx
First-Class Functions & Lambdas
xxx
Use second-order functions (map, filter, fold) on immutable data structuresxxx
Destructure values to access their componentsxxx
Use data types to represent optionalityxxx
Read basic type signaturesxxx
Pass lambdas to second-order functions
xxx
Algebraic Data Typesxxx
Pattern Matchingxxx
Parametric Polymorphismxxx
General Recursionxxx
Type Classes, Instances & Lawsxxx
Lower-Order Abstractions (Equal, Semigroup, Monoid, etc)xxx
Referential Transparency & Totalityxxx
Higher-Order Functionsxxx
Partial-Application, Currying, & Point-Free Style
xxx
Solve problems without nulls, exceptions, or type castsxxx
Process & transform recursive data structures using recursionxxx
Able to use functional programming "in the small"xxx
Write basic monadic code for a concrete monadxxx
Create type class instances for custom data typesxxx
Model a business domain with ADTsxxx
Write functions that take and return functionsxxx
Reliably identify & isolate pure code from impure codexxx
Avoid introducing unnecessary lambdas & named parameters
xxx
Generalized Algebraic Data Typesxxx
Higher-Kinded Typesxx-
Rank-N Typesxxx
Folds & Unfoldsxxx
Higher-Order Abstractions (Category, Functor, Monad)xxx
Basic Opticsxx-
Efficient Persistent Data Structuresxx-
Existential Typesxx-
Embedded DSLs using Combinators
---
Able to use functional programming "in the large"---
Test code using generators and propertiesxxx
Write imperative code in a purely functional way through monadsx--
Use popular purely functional libraries to solve business problemsx--
Separate decision from effectsxx-
Write a simple custom lawful monad---
Write production medium-sized projectsxxx
Use lenses & prisms to manipulate dataxx-
Simplify types by hiding irrelevant data with existentials
x--
Codatax--
(Co)Recursion Schemesx--
Advanced Opticsxx-
Dual Abstractions (Comonad)xx-
Monad Transformersx--
Free Monads & Extensible Effects---
Functional Architecturexxx
Advanced Functors (Exponential, Profunctors, Contravariant)x--
Embedded DSLs using GADTs, Finally Tagless---
Advanced Monads (Continuation, Logic)xx-
Type Families, Functional Dependencies
x--
Design a minimally-powerful monad transformer stack---
Write concurrent and streaming programs---
Use purely functional mocking in testsx--
Use type classes to modularly model different effectsxx-
Recognize type patterns & abstract over themx--
Use functional libraries in novel waysxx-
Use optics to manipulate statexx-
Write custom lawful monad transformersx--
Use free monads / extensible effects to separate concernsx--
Encode invariants at the type levelx--
Effectively use FDs / type families to create safer code
x--
High-Performancexx-
Kind Polymorphismx--
Generic Programmingxx-
Type-Level Programmingxx-
Dependent-Types, Singleton Typesxx-
Category Theory---
Graph Reduction---
Higher-Order Abstract Syntax---
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 statesx--
Use dependent-typing to prove more properties at compile-timex--
Understand deep relationships between different concepts---
Profile, debug, & optimize purely functional code with minimal sacrifices