
This well-respected text offers an accessible introduction to functional programming concepts and techniques for students of mathematics and computer science. The treatment is as nontechnical as possible, assuming no prior knowledge of mathematics or functional programming. Numerous exercises appear throughout the text, and all problems feature complete solutions. 1989 edition.
[1] https://www.amazon.com/Introduction-Functional-Programming-C...
We covered lambda calculus at university (at HW actually) and I'd played with SML/NJ and OCaml before. But seeing the lambda calculus abstractions being constructed over and over to create numbers (which I'd covered) and types and things, then finally become recognisable as ML was a real "ahaaa" moment for me.
I highly recommend An Introduction to Functional Programming Through Lambda Calculus by Greg Michaelson.
You can then see how to express Functional Techniques in your language of choice (i.e. one you already know well eg; Functional Programming in C++ by Ivan Cukic) before learning a new Functional Language. This is to avoid the confusion in syntax/semantic expression of unfamiliar concepts which is a bit too much for a beginning student to handle simultaneously.
Regarding combinators the famous intro is the latter half of Raymond Smullyan's To Mock a Mockingbird.
It starts with the general rules of lambda calculus, then build up some basic functions (like in the PDF linked in this thread) and continues to build data types like Natural Numbers, List, String, Tree and operators for manipulating them. The book also explains about the evaluation methods as well as covering how ML and LISP uses lambda calculus.
An Introduction to Functional Programming Through Lambda Calculus
Book by Greg Michaelson
It's amazing it was published 31 years ago (1989) which shows that it's a timeless book to read.
This has been referenced from discussions a couple of times:
https://news.ycombinator.com/item?id=6093386
https://news.ycombinator.com/item?id=3851352
https://news.ycombinator.com/item?id=11578961
https://news.ycombinator.com/item?id=10714770
https://news.ycombinator.com/item?id=773369
https://news.ycombinator.com/item?id=16973546
https://news.ycombinator.com/item?id=14395620
https://news.ycombinator.com/item?id=13211603
To quote a SO answer on why learn lambda calculus[0]:
If you want to program in any functional programming language, it's essential. I mean, how useful is it to know about Turing machines? Well, if you write C, the language paradigm is quite close to Turing machines -- you have an instruction pointer and a current instruction, and the machine takes some action in the current state, and then ambles along to the next instruction.
In a functional language, you simply can't think like that -- that's not the language paradigm. You have to think back to lambda calculus, and how terms are evaluated there. It will be much harder for you to be effective in a functional language if you don't know lambda calculus.
[0] - https://stackoverflow.com/questions/114581/how-helpful-is-kn...