Functional Programming for the Real World, by Tomas Petricek and Jon Skeet, introduces the functional programming paradigm by comparison to more traditional imperative programming techniques. The first part of the book goes through many common programming tasks and compares how you would implement them in the C# programming language and then re-introduces the problem from a functional perspective using F#. It introduces simple ideas such as recursion and how to use recursion to simulate many iterative constructs to the idea of higher-order functions, all the while keeping the explanations and examples very clear. The author also strives to instill good functional design practices in the reader by introducing different ways to think of functional programs and common design patterns that can assist in clean implementations.
The second half of the book dives into more advanced functional concepts, such as lazy evaluation, efficiency, and continuations. It also takes a look at using functional programming for practical tasks. Overall, this section is more suited towards someone who understood the majority of the first half of the book, or to someone who is already familiar with functional concepts.
I would recommend this book to newcomers and intermediate programmers who are looking to learn about or refine their functional programming skills. The authors do a good job of covering the core material and also introduce a good amount of advanced material towards the end of the book.