## 開篇
我們這些碼農做事都是很拖拉的。每天例行報到后,先來點咖啡,看看郵件還有RSS訂閱的文章。然后翻翻新聞還有那些技術網站上的更新,再過一遍編程論壇口水區里那些無聊的論戰。最后從頭把這些再看一次以免錯過什么精彩的內容。然后就可以吃午飯了。飯飽過后,回來盯著IDE發一會呆,再看看郵箱,再去搞杯咖啡。光陰似箭,可以回家了……
(在被眾人鄙視之前)我唯一想說的是,在這些拖拉的日子里總會時不時讀到一些[不明覺厲](http://www.baike.com/wiki/%E4%B8%8D%E6%98%8E%E8%A7%89%E5%8E%89)的文章。如果沒有打開不應該打開的網站,每隔幾天你都可以看到至少一篇這樣的東西。它們的共性:難懂,耗時,于是這些文章就慢慢的堆積成山了。很快你就會發現自己已經累積了一堆的收藏鏈接還有數不清的PDF文件,此時你只希望隱入一個杳無人煙的深山老林里什么也不做,用一年半載好好的消化這些私藏寶貝。當然,我是說最好每天還是能有人來給送吃的順帶幫忙打掃衛生倒垃圾,哇哈哈。
我不知道你都收藏了些什么,我的閱讀清單里面相當大部分都是函數式編程相關的東東:基本上是最難啃的。這些文章充斥著無比枯燥的教科書語言,我想就連那些在華爾街浸淫10年以上的大牛都無法搞懂這些函數式編程(簡稱FP)文章到底在說什么。你可以去花旗集團或者德意志銀行找個項目經理來問問1:你們為什么要選JMS而不用Erlang?答案基本上是:我認為這個學術用的語言還無法勝任實際應用。可是,現有的一些系統不僅非常復雜還需要滿足十分嚴苛的需求,它們就都是用函數式編程的方法來實現的。這,就說不過去了。
關于FP的文章確實比較難懂,但我不認為一定要搞得那么晦澀。有一些歷史原因造成了這種知識斷層,可是FP概念本身并不難理解。我希望這篇文章可以成為一個“FP入門指南”,幫助你從[指令式編程](http://zh.wikipedia.org/zh/%E6%8C%87%E4%BB%A4%E5%BC%8F%E7%B7%A8%E7%A8%8B)走向[函數式編程](http://zh.wikipedia.org/zh/%E5%87%BD%E6%95%B8%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80)。先來點咖啡,然后繼續讀下去。很快你對FP的理解就會讓同事們刮目相看了。
什么是函數式編程(Functional Programming,FP)?它從何而來?可以吃嗎?倘若它真的像那些鼓吹FP的人說的那么好,為什么實際應用中那么少見?為什么只有那些在讀博士的家伙想要用它?而最重要的是,它母親的怎么就那么難學?那些所謂的closure、continuation,currying,lazy evaluation還有no side effects都是什么東東(譯者:本著保留專用術語的原則,此處及下文類似情形均不譯)?如果沒有那些大學教授的幫忙怎樣把它應用到實際工程里去?為什么它和我們熟悉的萬能而神圣的指令式編程那么的不一樣?
我們很快就會解開這些謎團。剛才我說過實際工程和學術界之間的知識斷層是有其歷史原因的,那么就先讓我來解釋一下這個問題。答案,就在接下來的一次公園漫步中: