函數式編程一年體會
一開始:Scala
很高效的Java,因為它用一半的代碼實現同樣的功能
深入:Haskell
在社區遇到一個笑話:Scala是Haskell的入門誘餌。別人拿Haskell當笑話,但我發現Haskell確實強大。
深入:Scala庫
連函數和參數都看不懂,比如G[_], A → C, F[X → G[Y]],F.boo_(f(x))(g)(x)。
它們在哪個領域有用?那些聰明絕頂的人發明這些有什么用意?我現在有了答案,它們適合任意領域。不會抽象你就會重復發明輪子。
基礎
不可變性(immutability)
可組合性(composability)
透鏡(lenses)
函數式編程深深的吸引了我
數學
我一直以為自己數學好,直到遇上函數式編程。曾經花了3個月時間才完全理解一個問題。
感到恐慌
推薦Functional Programming in Scala,很棒的書,幫你渡過學習難關
感悟:抽象
最近回顧了一下8個月以前寫的代碼,驚了。
良好的oo風格的,很多繼承和代碼重用,“這不就是一個幺半群(monoid )和一堆翔嘛我怎么沒意識到這是一個幺半群”,然后用三分之一的代碼量重寫了一下,而且靈活性翻倍。
然后我又看到一個文件,“誒這不就是自函子(endofunctor)嗎”,又用三分之一的代碼量重寫了一下,用起來更容易而且更強大了。
現在我比以前越來越多的感受到抽象。而且在代碼之外也這樣,比如UI設計,比如軟件需求。
感悟:自信
我以前總是想方設法測試代碼。而函數式編程的靜態類型系統讓我更安心,很多時候,只要代碼能編譯,它就是正確的。就這么簡單。
如果你真的需要測試,你可以用一條語句測試一堆函數,使用類似于ScalaCheck 的庫,它們會幫你自動生成測試數據。
下一步?
我再也回不去動態類型語言了。
我會一直用Scala,也愿意更多的接觸Haskell。最近還盯上了Idris。
學術!
我以前發現新的庫都會很激動,現在則是研究和學術論文。他們其實是一樣的,不過論文更短小精悍、可靠,更靈活。接下來一年我會學習更多的函數式編程和計算理論。
不要人云亦云,教條主義,說什么學術在現實世界沒有應用價值。
學術對現實有巨大的指導意義,哪怕一開始有很大的學習成本,它依然能幫你節約可觀的時間和精力,實現你的目標。
就好像你可以花6個小時寫1000行代碼,其中有10個bug和10個功能,但如果你首先花一點時間去學習,你可以用4個小時寫400行代碼,其中有1個bug和20個功能。我在工業界呆了許多年,但不僅僅是個碼農,我多么希望早一點懂函數式編程,因為那會節約我很多的時間、精力,免去更多的壓力。工業界往往對學術有一種輕蔑的態度。不要跟風。那些是讓自己的無知、懶和短視顯得正當的借口,是錯誤的。我希望你來試試。
</div>來自:http://top.jobbole.com/901/