One of the nice things about Haskell is that it has an extremely rich literature (as good as that of any programming language I've seen). Here is a list of some interesting and relevant books and papers written in Haskell. If you want to really master Haskell, it will be necessary to read and understand a fair number of pretty sophisticated papers, which can be a daunting task. This page includes links to some of these papers. It will be expanded as the track gets fleshed out more.
There aren't that many books on Haskell yet. Here are some I recommend.
Haskell: the Craft of Functional Programming by Simon Thompson. This is the first Haskell book I read. It's quite decent, taking a fairly orthodox approach to the material.
The Haskell School of Expression by Paul Hudak. Unusually, this book uses multimedia programs as a way of motivating the study of Haskell. Hudak is one of the original authors of the Haskell language.
Introduction to Functional Programming using Haskell by Richard Bird. This book is more theoretically-oriented than the first two and less gentle (and more expensive!). It emphasizes the "point-free" style whereby functions are built by the composition of smaller functions. This leads to very elegant and concise code, but learning to read this style will take some work.
A really useful book on functional data structures is Chris Okasaki's Purely Functional Data Structures. Although the code examples are in Standard ML, Haskell translations of the code are included in the book.
Now we come to the most important part: the papers. Don't be dismayed if you have to re-read some of these papers several times before all the ideas sink in; even understanding a few pages of a difficult paper will help your overall understanding of the language, and a paper that seems intractably difficult today will probably seem quite easy after you get more experience writing programs in Haskell.
A great introductory paper is Why Functional Programming Matters by John Hughes, a well-known Haskell researcher. This is a pretty old paper; it actually predates Haskell, and the paper uses a language called Miranda (which is a precursor to Haskell) for its examples. Nevertheless, it is quite readable and provides excellent exposition on why lazy functional programming is worth learning. The board game solver is particularly impressive; equivalent code written in a more conventional language would be much longer, and would not be nearly as flexible.
An interesting paper is Tackling the Awkward Squad by Simon Peyton-Jones (one of the chief architects of Haskell and the lead developer of ghc). This describes how to write programs in Haskell which involve input/output, concurrency, exception handling, and foreign function calls -- all in the same program!
When you've learned the basics of monads and want to delve deeper into
both the theory of monads and why they're important, a good paper to read is
Monads For Functional
Programming by Phil Wadler. Wadler introduced the concept of monads into
functional programming languages, and he's been one of its most outspoken
advocates. Some of his (many!) papers are very tough sledding; this one is
one of the more accessible ones. He shows how monads can be used to
structure an interpreter for a very simple programming language so that major
changes can be made to the semantics of the language without having to
rewrite a lot of code. Note that at the time this paper was written, the
monad notation we use today (the do
notation and the
>>=
and >>
operators) had not been standardized, so
you will have to mentally translate between Wadler's notation and modern
notation. (By the way, that's something you will have to learn to deal with
in a lot of Haskell papers.) A useful exercise would be to take Wadler's
code and translate it into a form that can be compiled using modern Haskell
compilers. This paper will really open your eyes to the true power of
monads.
Once you've read the previous paper, you're going to want to check out some of Phil Wadler's other papers. Here is his home page, and his papers are linked off of this. One caution: the titles of most of his papers are puns or plays on words of various kinds, so if you think that a title like "Linear Types Can Change The World!" seems grandiose, that's because it's a pun. Once you understand the pun, you will have learned something interesting about functional programming, type theory, or both. Be prepared to spend a lot of time working your way through these papers.
If you want to know what there is beyond monads, the answer is arrows, which are a generalization of monads. The link provides a brief description of arrows as well as links to the key papers in that area. If you thought monads were conceptually tricky, you ain't seen nothing yet.