Last updated: August 30, 2023

There are a lot of excellent Haskell talks and articles out there, and I often need to point people to great explanations of particular concepts. These aren’t be-all end-all expositions of each idea; many are selected to be solid introductions which make it easy to jump off into further learning.

There’s a rough organisation to this page: concepts which are niche or have more dependencies are listed further down each section (or subsection). For accessibility’s sake, I have tried to list only free resources as much as possible. Paid resources are indicated with a ($).

Getting Started

There’s a sort of “trunk” to learning Haskell, during which a new Haskell programmer must first pick up a whole lot of (possibly new) concepts: recursion, folds, problem-solving with pure functions, the type class abstraction and critical type classes (Eq, Ord, Show, Read, Num, Semigroup, Monoid, Foldable, Traversable, Functor, Applicative, and Monad, probably), and the IO type. Links in this section aim to help with these sorts of challenges.

Writing “Real” Programs

“Common” Knowledge

After climbing the trunk, things start to branch out, but there’s still a lot of common folklore, patterns and ideas which tend to show up all over modern Haskell code.

Parse, Don’t Validate

Monad Transformers

Functory Things


Parsing and Printing

GHC Generics

Template Haskell

Big Ideas

These are either some of the amazing galaxy-brained ideas that make Haskell such a fun language to work in, or entry points into library ecosystems which are a bit “off the beaten path”.

Higher-Kinded Data

Free Monads and Effect Systems

Recursion Schemes

The pitch: You can rewrite a recursive data type as the fixed point of some “base” functor. The chosen functor represents one “layer” of the data structure, and recursion schemes let you write functions that produce, consume, or transform whole structures by writing small functions that operate mostly on the “base” functor.

Property-Based Testing

Generate random inputs to tests, and shrink them down to minimal reproduction examples if the tests fail.

Continuation-Passing Style (CPS)

Functional Reactive Programming

Smaller (but still Mighty) Ideas


Monoidal Parsing

Perspectives from Other Languages

Copyright © 2023 Jack Kelly
Site generated by Hakyll (source)