想要理解函數式編程的思想,最好用哪種函數式編程語言入門?


====正統route====

1. 一門ML系語言(Standard ML/OCaml)。能學到的東西:一等函數;代數數據類型/模式匹配;強大的模塊系統;CPS;用類型表達簡單的業務約束;equational reasoning的思考方式;etc

2. Haskell。能學到的東西:effect system入門,類型層面管理副作用;惰性求值;比ML系強大許多倍的類型系統,表達更強的約束;大幅減少測試需要量,以及類型導向測試;輕易開發並行與分散式程序的方法;調試內存泄漏bug的技巧;etc

3. 有更高級類型系統的語言們:Coq,Isabelle,Agda,Idris,F*,ATS,etc。能學到的東西:編寫可信任軟體。

PhD end~~撒花~~

====類型去死route====

1. 一門Lisp系語言。Lisp系方言何止千千萬,能學到的東西三天三夜列不完(

2. 一門APL系語言,APL自身或者J/K之類的改版都行。

3. 一門Erlang系語言(Erlang/Elixir/Lisp-flavored Erlang)

正在找工作 end~~撒花~~

====找工作route====

隨便挑一門能在JVM上或者瀏覽器里跑得起來的語言吧(


看到這個題目實在太想回答了,憋不住了。

一直研究函數式編程,實在太喜歡函數式編程了,雖然工作用不到,但是這種大道至簡,分形幾何可以與其媲美, 之前看別人介紹周易,提到了一種全息的思想, 也就是說構成整體的部分包含了整體的全部信息。我一直像寫函數式編程思想的文章,借你的問題,我大致說一下吧。其實minecraft也有這樣的特點。

函數式編程最根本的思想是 higher-order function 和algebraic datatype。

1. higher-order function,就是function is first-class citizen,可以用高階函數構造數據結構,因為有了closure就有了所需要的一切, 當然工具函數 map、foldr、foldl和filter不得不提。

2.algebraic datatype ,在SCIP中提到了代數數據類型, 在haskell中乾脆把用戶定義的數據類型直接稱為algebraic datatype。總之,你的數據類型採用遞歸定義,能夠通過ctor,selector去構造,獲取部分,而且部分和整體同構,非常方便遞歸函數處理。 haskell,scala,c++中的pattern match非常適合處理algebraic datatype。

3.pure function and immutable datatype: 只有函數是pure,datatype是immutable(當然局部可以mutable)才可以進行lazy evaluation。delay evaluation傳遞的是form,而form只需要採用memo

計算一邊,cache起來,直接用就可以了。 當然memo就是local mutable的數據結構。

4.lazy evaluation:為什麼要lazy evaluation呢? 因為lazy evaluation的好處有:1.只計算一次,2.short circuit 3. stream,也就是infinite數據解構。

5.macro:Lisp支持宏,有了宏才有form,有了form才可以讓lazy evaluation寫起來漂亮,否則寫成閉包多醜陋,不支持的macro的haskell的evaluation本身就是laziness,除非加!。

6.monad: 謎一般的monad,只有形式,沒有內容,實在是haskell中的第一殺器。

7.proper tail recursion或者tail recursion optimizing:將普通的遞歸函數寫成in-place計算的iterative形式的計算,當然編譯器得支持,據說clojure不支持尾遞歸優化。

8. reason about equation: 參考programing in haskell,怎麼將普通的遞歸函數修改為尾遞歸。

9. meta-programming:函數式編程提供了強大的元編程能力。


Scheme、Standard ML偏教學,語法要簡單很多,學習資源也豐富,更適合用來了解核心的函數式編程思想。Scala、Haskell、Common Lisp這些偏向開發,可能更實用,但也更繁瑣了。主要思想掌握了,上手同類東西還是很快的,所以Scheme、SML挺好的。

另外不管學習哪種函數式語言,工作上可能都不能直接用。乾脆不要太計較語言,找一個靠譜的學習資料更重要。下面列舉一些課程吧:

CMU 15-150 ,使用SML。可能是感覺並行和分散式的春天來了,CMU突然開始非常重視函數式編程,7門計算機核心課程中兩門是函數式相關的https://www.csd.cs.cmu.edu/content/bachelors-curriculum-admitted-2014,另外一門是使用函數式語言做課程作業的演算法和數據結構http://www.cs.cmu.edu/~15210/index.html)

MIT 6.037 - Structure and Interpretation of Computer Programs,使用Scheme。使用的是SICP這本與課程同名的書,曾經的課程編號是6.001,是MIT EECS必學的4門課程之一。現在的和MIT6.001對應的是MIT6.00,編程語言換成了Python,相對之前使用Scheme的6.001,更強調動手做一些玩具而不是編程理論了。

Berkeley CS 61A Summer 2016,使用Scheme。Berkeley非常推崇MIT的SICP,曾經CS61的主講評價SICP是「the best computer science book in the world」,所以Berkeley之前用的也是Scheme。不過新的CS61也換成了Python,然而不同於MIT,Berkeley新的CS61講授的內容結構和SICP基本一樣,只是語言不同,而且仍然保留了Scheme版的SICP作為自學課,就是現在的CS61A。

EPFL Functional Programming Principles in Scala https://www.coursera.org/learn/progfun1,使用Scala。這門課Coursera上也開了,所以自學挺方便的。課程結構和SICP很像。

UW Programming Languages CSE341, Autumn 2015,裡面講了各種編程範式,函數式這塊使用了Scheme。如果只是為了了解,可能這種比較式的課程更合適。這門課Coursera上也開了,自學方便。

現在好資源真的很多,要靠自己把握了。自勉一下~


當然是 Lisp 啦


評論說得對, 總歸要看 Haskell...

其中的思想很多, 拆開就是一些點吧, 前面已經有一份了, 我也 寫一點我的理解吧:

### Pure Function, Recursion, Higher Order Functions,

函數式編程首先是函數的複雜抽象, 尾遞歸, 高階函數等等.

這一天很多語言都支持. Haskell, Clojure, JavaScript, Lua, 一般年輕點的語言都可以.

### immutable data

不可變數據是跟主流語言差別最大的一點, 對編程方式影響很大,

主要語言是 Haskell, Clojure, 不過 Haskell 更嚴格, 我是被難倒了.

在 JavaScript 或者 Java 當中通過類庫也可以體驗.

### 代數類型系統(ADT)

ADT 在 ML 風格的語言里都有, Haskell, OCaml 等等.

### Macro, 元編程

Lisp 系的語言, 聽說 Scheme 里最為強大, 當然 Clojure, CommonLisp 也支持,

另外在 Julia 里也支持宏, 感覺有點奇怪.. 因為還是要 S 表達式語法才比較好.

JavaScript 社區有人用編譯器來做 Macro 的事情, 比如 sweet.js 開下腦洞.

### 惰性求值

惰性求值可以部分代替 Node.js Stream 那樣的功能, 減少內存使用.

我了解不多, 看到前面答案才想起來... 在 Haskell, Clojure 當中比較明顯.

### Monad

學 FP 不膜拜一下 Monad 總是有點缺憾, 學一下 Haskell 吧...

我熟悉的主要是 Clojure, JavaScript, Haskell 這邊,

其他的 Scala, Elixir, Scheme 等等也實現了相當多函數式編程的功能,

建議根據具體的知識點去學, 一般來說一門語言還是不夠.


先把c++的基本功打好 然後再去學別的 要不容易走入異端

勿往浮沙建高台


當然是J語言啦


刻意去學所謂「函數式編程思想」就和刻意去學「面向對象編程思想」一樣沒意義,有思想,寫C一直都是寫函數式的C。也可以隨便寫面向對象的C。

目前函數式這個筐子,很多稀奇古怪的特性都被各種人往裡面裝,要拋棄那些軟文自己去理解自己的函數式。

實在糾結,就去看Haskell和它的一系列增強版,因為這東西標榜純函數式,也是目前一大堆函數式狂熱者里最流行的。看完後就像買了所謂的頂級耳機或鍵盤、不會有遺憾了。

要麼就去看看JavaScript,這個是最接近那些函數式狂熱者標榜的函數式語言標準,同時學了還真能對找到工作有幫助的。寫前端寫後台,多賺點錢,多陪陪家裡人。


Standard ML入門;

可以去找Coursera的programming languages課程, 裡面有SML的內容,還有racket(一種lisp)的內容,入門可以了


最根正苗紅的肯定是 APL 啊ww


Elixir 文檔詳細,入門簡單,工具方便,包多。

logo好看,團隊隨和,人氣旺。


我覺得OCaml是很實用的語言,雖然沒有Haskell那麼學術,但是真的是很實用的語言,而且入門也不難,速度又快,主要的缺點就是對windows平台不是那麼友好(如果你要好好在windows下面用ocaml,得會一些bash,得懂一些c++編譯器的使用,因為初期好多手動的工作,尤其是你想用脫離cygwin和mingw用一個純msvc版本的ocaml的話,你還得完整地自己把ocaml編譯過)

不過我的函數式啟蒙是從用C#下面的Linq開始的。

我覺得還是結合實際工作的需求去入門去比較好。


當然是F#語言啦。

F就是Functional,絕對夠函數式。


竟然沒人說 mathematica.


SML虐我千百遍,我待SML如初戀…上學期上了CMU 15150,差一點就拿C了好驚險。SML作為教學用還是很不錯的,因為理論方面比較完善。SML里有個概念叫totality。有了這個totality可以證明很多theorem。這個是Haskell做不到的


haskell啦,其實scheme也不錯。。


如果題主已經掌握編程的一般概念而想知道函數式編程和其他編程風格有何區別的話,我覺得JavaScript是個選擇。最好還是比較古老的JavaScript,沒有prototype,import等雜七雜八的東西。

原因如下:

函數式編程的核心概念都有,function as an object,closure支持的都很好。

語言簡單,一小時上手。

最關鍵的一點,JavaScript特性很少,導致了很多東西必須用函數式編程來解決。像用closure來模擬OOP里的對象這種黑科技滿大街都是,拿來學習剛好。


Scheme/Standard ML/Haskell

反正每天看的Functional相關的資料一上來不是Haskell就是ML,要麼就是直接Lambda Calculus開講。


當然是haskell


當然是JavaScript了。


推薦閱讀:

Scheme語言中的「不可變數據」會產生性能問題嗎?
函數式編程如何優雅的處理很多 多個函數都要用到的 參數?
如何掌握函數式編程?
以函數編程語言作為入門的編程語言有什麼好處?
聲明式編程和命令式編程有什麼區別?

TAG:編程語言 | 函數式編程 | Lisp | Erlang編程語言 |