This book gives a lucid and thorough account of the concepts and techniques used in modern functional programming languages. Standard ML is used for notation, but the examples can be easily adapted to other functional languages.
The book is aimed at advanced undergraduate or graduate level students who are familiar with another high-level language and discrete mathematics. It will also be invaluable to professional programmers who wish to explore the new possibilities opened up by functional programming.
I'm astonished how little known this book is, because it's one of the best introductory works on pure functional programming I've found. It's slightly out of date — Haskell didn't exist when the book was written, so it uses a variant of SML with lazy semantics, but the essentials are as valid today as they were in 1989.