preface
I was first introduced to functional programming (FP) in the form of Common Lisp back in 2000 when I took an Artificial Intelligence class at my university. At first, Lisp appeared spare and foreign compared to the object-oriented languages I was used to. But by the end of the semester, I had built many assignments in Lisp, and it started to feel comfortable. I had gotten a taste of FP, even if I had only just begun to understand it.
Over the years, my use of functional programming deepened. I wrote my own Lisp. I read books on Lisp. I started doing my assignments from other classes in it. And from there, I was introduced to Haskell and eventually Clojure in 2008. In Clojure I found my muse. It was built on the 50-year tradition of Lisp, but on a modern and practical platform. And the community was churning through ideas about computation, the nature of data, and the practical engineering of large software systems. It was a hotbed of philosophy, computer science, and engineering. And I ate it up. I blogged about Clojure and eventually built a company to teach Clojure.
Meanwhile, awareness of Haskell was also on the rise. I worked in Haskell professionally for a few years. Haskell had a lot in common with Clojure, but there were also a lot of differences. How could we define functional programming to include both Clojure and Haskell? That question led to the seed of this book.