Further Reading

Every recommendation below comes with an honest note on what it's actually good for — none of this is a bare link dump. Read in roughly the order given if you're starting from scratch.

Books

Learn You a Haskell for Great Good! — Miran Lipovača

The friendliest possible on-ramp, and still the best first book for most people despite its age. Its great strength is tone: it never assumes you already think functionally, and it takes genuine care over exactly the kind of "what IS a function" confusion Chapter 2 of this book opens with. Free to read online, which makes it an easy first stop before committing to anything longer.

Programming in Haskell — Graham Hutton

Where Lipovača optimizes for friendliness, Hutton optimizes for precision — this is the book to read once you want the ideas stated tightly and correctly, with real attention paid to equational reasoning (Chapter 4 of this book leans directly on the style Hutton teaches). Used widely as an actual university textbook, and it reads like one in the best sense: dense, well-sequenced, no filler.

Real World Haskell — Bryan O'Sullivan, Don Stewart, John Goerzen

The book to reach for once the fundamentals from this site have settled and you want to build something real — parsers, web services, concurrent programs. Some library-specific details have aged (it predates several now-standard tools), but the engineering judgment throughout — when to reach for laziness, when to fight it, how to structure a real project — holds up extremely well. Free to read online.

Thinking Functionally with Haskell — Richard Bird

The book for the reader who wants Chapter 4's "equational reasoning" promise taken all the way seriously. Bird treats Haskell programs as mathematical objects to be derived and proven correct, not just written and tested. Demanding, and genuinely rewarding if you want to see how far the "code as math" idea actually goes.

Category Theory for Programmers — Bartosz Milewski

The single best resource for turning this book's Chapter 8–10 "category-theoretic asides" into real, working understanding. Milewski teaches category theory *to* programmers, using Haskell (and some C++) as the worked examples throughout, rather than teaching abstract math and hoping the programming connection is obvious. Free as a set of blog posts, also collected into a PDF and a paperback.

Purely Functional Data Structures — Chris Okasaki

Answers the question Chapter 4's "Cool Fact" box raises and doesn't fully resolve: how do you build genuinely efficient data structures — queues, heaps, search trees — when nothing is ever allowed to mutate? Based on Okasaki's PhD thesis, and still the definitive reference on the subject a quarter-century later.

The Lambda Calculus: Its Syntax and Semantics — Henk Barendregt

The definitive, exhaustive mathematical treatment of everything Chapter 1 introduces informally — beta reduction, alpha-conversion, Church encodings, and fixed-point combinators, proven rigorously rather than motivated by example. Not a casual read, but the single most authoritative source on the subject.

Papers

Why Functional Programming Matters — John Hughes (1990)

If you only ever read one paper about Functional Programming, make it this one. Hughes makes the case — with the actual, small, convincing code examples to back it up — that laziness and higher-order functions aren't stylistic preferences but genuine tools for modularity, echoing exactly the "generate vs. consume" separation Chapter 5 walks through with `primes`.

On Computable Numbers — Alan Turing (1936)

Published the same year as Church's lambda calculus paper, and proven shortly after to define exactly the same class of computable functions. Worth reading alongside Chapter 1 specifically to see two totally different-looking formalisms — an abstract machine with a tape, versus a calculus of pure substitution — arrive at the identical notion of "computable."

Monads for Functional Programming — Philip Wadler (1992)

The paper that took monads from a category-theory curiosity into a working tool for programming language design, written by one of the people most responsible for their presence in Haskell at all. Denser than Hughes's paper above, but reading it after Chapter 10 of this book — rather than before — makes it far more approachable than its reputation suggests.

Composable Memory Transactions — Harris, Marlow, Peyton Jones, Herlihy (2005)

The original STM paper Chapter 7 is built on. Technical and implementation-focused, but the motivating examples — especially around why lock-based code fails to compose — are worth reading even without following every proof.

Beautiful Concurrency — Simon Peyton Jones (2007)

The more accessible essay version of the same ideas, written for the *Beautiful Code* anthology rather than a systems conference. The direct source for this book's Chapter 7, and this book's title for that chapter.

A History of Haskell: Being Lazy with Class — Hudak, Hughes, Peyton Jones, Wadler (2007)

A genuinely fun read, not just a historical record: the committee members who actually designed Haskell explain the arguments, dead ends, and compromises behind decisions this book treats as settled fact — including why laziness became the default (Chapter 5) rather than an opt-in feature.

Talks & video

"Beautiful Concurrency" — Simon Peyton Jones

The talk this book's Chapter 0 quotes from directly. Watching Peyton Jones derive Software Transactional Memory live from Haskell's purity guarantees is the clearest possible demonstration that "purity" (Chapter 6) isn't an academic nicety — it has sharp, practical teeth.

"Propositions as Types" — Philip Wadler

A wonderful, largely code-free lecture on the Curry–Howard correspondence this book's Chapter 3 mentions in passing. Wadler traces the idea from Curry and Howard's original insight through to how it shapes Haskell's type system today — genuinely accessible even without a formal logic background.

People to know

Alonzo Church (1903–1995)

Invented the Lambda Calculus in the 1930s as a foundation for mathematical logic — decades before electronic computers existed. Every function definition in this book is, underneath, Church's notation with better syntax.

Alan Turing (1912–1954)

Published his own, independent formalization of computability the same year as Church — the Turing machine — and proved shortly after that it and the lambda calculus define exactly the same class of computable functions, a result now called the Church-Turing thesis.

Haskell Curry (1900–1982)

Pioneered combinatory logic and gave his name to the language this book is about (chosen by the Haskell committee specifically to honour him). 'Currying' — turning a multi-argument function into a chain of one-argument functions — is his idea, used silently throughout every chapter here.

Simon Peyton Jones (b. 1958)

Lead designer of GHC, the compiler almost everyone means when they say 'Haskell,' and one of the most persistent, most quoted advocates for why laziness and purity are worth their cost.

Philip Wadler (b. 1956)

Brought monads into practical programming-language design and did foundational work connecting type theory to logic (Curry–Howard) — two ideas that, between them, underpin roughly half of this book.

Saunders Mac Lane & Samuel Eilenberg (1909–2005 / 1913–1998)

Founded Category Theory itself in the 1940s, originally to formalize a notion of 'natural transformation' in algebraic topology — with no idea it would, sixty years later, become the vocabulary Chapters 8 through 10 of a Haskell book would borrow wholesale.