關於函數式編程的思考?

學了函數式語言也快一年了,斷斷續續,從lcommon lisp 到了 clojure,無論說是實用或者不實用,確實改變了我很多的想法,但是老師說,你為什麼不看遊戲引擎這類,新式語言雖然很好用,但是國內用的很少,工作很難找。所以我想說函數式語言的出路在哪裡?


你學習一個東西的動機就是為了用它本身?

「確實改變了我很多的想法」不是很好嗎。

函數式語言的出路在哪裡?這個不用你操心,你先確保你的技能可以找到一份工作,肚子吃飽了再根據興趣研究,

函數式語言沒什麼牛逼的,現在的函數式語言都是c或c++寫個核心,然後在其上實現完整語義。所以說白了,你要真對函數式語言感興趣,可以研究一下continuation啊,lambda啊都是怎麼實現的,很多時候你用c++和lua混合編程,可能是因為lua的coroutine,那它是怎麼實現的你知道嗎?

所以重要的不是語法,是語義,是實現。你腦子裡應該只有一種「語義集合」,你需要表達不同的概念時選擇合適的語義,然後在你們公司項目使用的語言中選擇表達這個語義的合適語法。很多人喜歡某個語言其實就是因為他腦子裡的「語義集合」使用該門語言最容易表達,沒有對應的語法咋辦?自己造個DSL嘛。

你需要的不是《編譯原理》而是《編程語言實現模式》。

再推薦幾個項目,tinyxml2,lua,google re2,antlr,按順序看代碼。

最後說一句,不要死抱著一種Paradigm不放,每個都要接觸一下,推薦學習c++,lua,javascript,Scala,erlang。後兩者還是有一些公司在用的。像erlang的虛擬機,本身就相當於一個分散式sever了,很有學習價值


學習各種不同語言,理解其對於設計的影響,好比練內功;學習遊戲引擎之類的某個具體技術,好比練招式。相關卻更似兩個維度上的東西,好比你正在練易筋經,你老師跟你說不如去練無影腳吧。遊戲引擎3d實時渲染之類的也可以用函數式語言來做的,各種新型語言或者特性這幾年比前些年已經多多了,8年前我畢業的時候做的畢業設計把一個圖形用戶界面框架移植到到除了unix/linux 和windows 的另一個os平台上,居然找不出...,所以說各種高級語言或者高級特性的應用應該是個未來的趨勢了。不過你光憑著對語言的學習找工作難免不智,好比內力深厚不會招式也是不行滴...當然我們現在一般說某類語言的時候其實也暗指了該語言背後的平台、運行時、庫及第三方中間件等等。


在語義和語法的優勢之外,函數式編程另一個好處是減少side effects,就是說每個函數的輸入顯式的寫在參數列表裡,效果只體現在返回值上。 這有兩個好處,一是減少bug,少了內存溢出這類事情。二是你在寫完代碼一年後更容易知道這個函數怎麼用,提到代碼重用性。雖然函數式語言在性能上可能有所降低,但在硬體速度飛速增長的今天,這點降低完全可以由軟體工程上的優勢彌補。華爾街一家頂級的基金公司Jane street大量使用Ocaml,而且只招會函數式語言的軟體工程師和量化交易員。


推薦閱讀:

如何理解下面這段Haskell代碼?
參加 2017 年函數式編程聚會是什麼感受?
微軟和 Haskell 之間有什麼關係?
函數式編程所倡導使用的「不可變數據結構」如何保證性能?
函數式編程語言該如何表示樹結構呢?

TAG:函數式編程 | Lisp | Clojure | YCombinator函數式編程 |