I am now several months into learning F# with the greatest asset for learning F# being translating the OCaml code in "Handbook of Practical Logic and Automated Reasoning" (WorldCat) by John Harrison, into F#.
With this being such an effective method of learning, I plan to translate the code in more books to F#, but books primarily focused on functional concepts or real world applications typically known for being written with a functional language such as AI, compilers, Theorem Provers and Reasoning Assistants.
While one would think that translating a program from one language to another might be a trivial task, in reality when doing such one runs into differences not only in the language but the environment and tools that must also be learnt and understood to do the translation. One is required to explore the depths of both languages and their environments that are not typically considered when just reading about it. For example in translating Ocaml to F# I learned top-level, ocamldebug and time travel, trace and wishing F# had this, camlp4 and how it doesn't exist in F#, exception handling performance differences, and type inference in a manner that forced me to understand the F# counterparts in ways I would not have by just experimenting or reading books with F#.
Do you know of any other books that use/include source code, preferably functional, that cover concept(s) of functional programming or are real world applications typically written in a functional language and that will help in learning functional programming by translating the source code to F#?
To keep this objective and not subjective, the answers must explain why it is important, and you must have used the book not just browsed the book. I am looking for answers from people who have been doing functional programming for years and have found working through such a book a key to their success with functional programming. Examples of answers:
Type inference - "Types and Programming Languages" (WorldCat) by Benjamin C. Pierce. Importance: Helps to understand how to resolve type inference compiler errors which leads to better ways to resolve the error and results in better code.
CPS - "Compiling with Continuations" (WorldCat) by Andrew W. Appel – Importance: Helps to remove the use of a stack in recursion and thus stack overflows and improve performance. I think of tail-call optimization as optimizing a function and CPS as optimizing the program.
Term rewriting - "Term Rewriting and All That" (WoldCat) by Franz Baader and Tobias Nipkow Importance: With ATP and Proof assistants typically being written using a functional language and relying on term rewriting, if the term rewriting is incorrect then the proof engine is invalid.
Lambda Calculus - "An Introduction To Functional Programming Through Lambda Calculus" (WorldCat) by Greg Michaelson Importance: Lambda calculus is the basis of functional programming. Understanding this basic concept leads to a better understanding of functional programing.
EDIT
While I would like to hold off and wait for a better answer to accept, I have learned that after a few days on SO the views tail off considerably.
I find that both answers are great for anyone not familiar with the books and that if I didn't already know and have copies of most of the books I would seriously consider getting them.
Since PAD noted the more advanced books which is what I was after, I give him the accept vote. If could split the accept I would.