[Know about it][Understanding][Clear understanding]
xxxImmutable DataxxxSecond-Order FunctionsxxxConstructing & DestructuringxxxFunction CompositionxxxFirst-Class Functions & Lambdas
xxxUse second-order functions (map, filter, fold) on immutable data structuresxxxDestructure values to access their componentsxxxUse data types to represent optionalityxxxRead basic type signaturesxxxPass lambdas to second-order functions
xxxAlgebraic Data TypesxxxPattern MatchingxxxParametric PolymorphismxxxGeneral RecursionxxxType Classes, Instances & LawsxxxLower-Order Abstractions (Equal, Semigroup, Monoid, etc)xxxReferential Transparency & TotalityxxxHigher-Order FunctionsxxxPartial-Application, Currying, & Point-Free Style
xxxSolve problems without nulls, exceptions, or type castsxxxProcess & transform recursive data structures using recursionxxxAble to use functional programming "in the small"xxxWrite basic monadic code for a concrete monadxxxCreate type class instances for custom data typesxxxModel a business domain with ADTsxxxWrite functions that take and return functionsxxxReliably identify & isolate pure code from impure codexxxAvoid introducing unnecessary lambdas & named parameters
xxxGeneralized Algebraic Data TypesxxxHigher-Kinded Typesxx-Rank-N TypesxxxFolds & UnfoldsxxxHigher-Order Abstractions (Category, Functor, Monad)xxxBasic Opticsxx-Efficient Persistent Data Structuresxx-Existential Typesxx-Embedded DSLs using Combinators
---Able to use functional programming "in the large"---Test code using generators and propertiesxxxWrite 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 projectsxxxUse 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 ArchitecturexxxAdvanced 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