I am not an expert, but maybe because of that I believe that I can offer valuable advice to those who are totally new to functional programming (or feel that they are missing something), and want to get the core basics down cold without getting drowned in accidental complexity, do yourself a favor and start with edx's free moocs "How To Code" [1] [2], which are based on "How To Design Programs" [3]. After that, you will cruise through the recommended classics above.
If interested in why if you are an FP newbie said material is superior to SICP , read the pdf paper "The Structure and Interpretation of the Computer Science Curriculum" [4]
I would add Concepts, Techniques, and Models of Computer Programming. It's about programming paradigms in general, and helps in contextualizing functional programming in a broader context
This book is indeed mind blowing, and after reading it I find all those FP vs OO arguments sterile. As you say, this book makes you understand that it's all a trade-off.
In fact what this book does is advocate multiparadigm languages (actually the author dislikes the term paradigm, multiple programming models would be more acurate), and explains in great detail how to decide which to use when, and how to mix different paradigms (ehem, models) with the very powerful technique of impedance matching.
I cruised through most of it. But the last three chapters really twisted my brain (continuations, the Y combinator, and the metacircular interpreter). I was familiar with the concepts, but figuring out the programs by myself was a tough exercise (I haven't read SICP though).
Opening it on my phone, this paragraph on the available ebook formats very much made my day:
> A 386 can, in theory, run Linux, Emacs, and a Scheme interpreter simultaneously, but most 386s probably can’t also run both Netscape and the necessary X Window System without prematurely introducing budding young underfunded hackers to the concept of thrashing.
Trust me, it will :) The last few chapters on CPS and the Y combinator are roughly a vertical segment on an otherwise nearly horizontal learning curve.
I would also add "ML for the working programmer", which is, perhaps surprisingly, more about functional programming than the particularities of ML. In any case, it is a great book.
It is one of the only accessible texts on Standard ML, I'll give it that... But it goes neither deep nor wide in content. I did not find it very useful.
[0] The Structure and Interpretation of Computer Programs
[1] The_Little_Schemer
[2] Programming in Haskell - Graham Hutton
[3] Types and Programming Languages-Benjamin C. Pierce
--- PDFS
[0](https://github.com/allenleein/brains/blob/master/Zen-of-Func...)
[1](https://github.com/allenleein/brains/blob/master/Zen-of-Func...)
[2](https://github.com/allenleein/brains/blob/master/Zen-of-Func...)
[3](https://github.com/allenleein/brains/blob/master/Zen-of-Func...)