One might think that Haskell is great for research and teaching, but perhaps not as great for practical applications because of messy real-world complications. On the contrary, it turns out Haskell can elegantly resolve these complications.

Applicative programming with effects by Conor McBride and Ross Paterson

Introduces applicative functors, a useful abstraction lying between functors and monads. Indeed, these are so useful that GHC has elevated applicatives to their rightful place in the pantheon alongside functors and monads.

Lazy Functional State Threads by John Launchbury and Simon L Peyton Jones

Some data structures work best when mutable, and a clever extension of the type system lets us operate on them in Haskell.

Purely Functional Data Structures by Chris Okasaki

Although challenging, lazy evaluation and immutability can be helpful when designing data structures. Code is simpler, and we gain persistence. This PhD thesis later became a book.

Functional Programming with Bananas, Lenses, Envelopes, and Barbed Wire by Erik Meijer, Maarten Fokkinga, and Ross Paterson

They might have gone a bit overboard with the notation, but the underlying idea is incredible. We learn how to manipulate programs algebraically. We calculate programs.

Beautiful concurrency by Simon Peyton Jones

Introduces Software Transactional Memory (STM), which neatly solves tricky concurrency problems.

Template Meta-programming for Haskell by Tim Sheard and Simon Peyton Jones

Sooner or later, we want programs to generate code. This paper shows how it’s done in Haskell.

Warp by Kazu Yamamoto, Michael Snoyman, and Andreas Voellmy