2012-07-13 36 views
6

我想學習一種功能語言,以擴大我的視野。我掌握了Python和C/C++的知識,並且我希望語言能夠很容易地從來自語言的必要領域的人那裏學習。我不在乎這種語言是否足夠強大。我只想學習一門語言,以便學習函數式編程的基礎知識,然後我會嘗試一個更困難(和強大的語言)。對於有命令式語言背景的人來說,哪一種最簡單的函數式編程語言?

感謝

+3

Haskell經常被推薦學習功能範例,因爲它是純粹的。這並不容易,但也許你可能會混淆其他語言(Scala和其他語言)中的程序和功能範例。 – MatijaSh 2012-07-13 12:12:21

回答

8

我建議pure-lang這些教學目的。它也很強大。如果你想要更受歡迎的東西/有更多的社區支持,那麼我會推薦Scheme或OCaml,具體取決於你是否寧願處理陌生的語法(使用Scheme),或者先處理不熟悉的類型(使用OCaml)。 SML和F#僅與OCaml略有不同。其他人已經或將要提到Clojure,Scala和Haskell。

Clojure是Scheme的一個變體,它有自己的特性(例如沒有tail-call優化),所以使用它將是一種以Scheme開始的方式。不過,我希望你可以用一個不太特別的Scheme實現來輕鬆一點。 Racket是經常用於教學的東西。 Scala看起來與OCaml基本相似,但這只是基於偶然的熟悉。與Haskell不同,所提及的其他語言都有兩個優點:(1)默認情況下,評估順序是非常渴望的,儘管您可以通過專門請求評估順序來獲得惰性評估。在Haskell中則相反。 (2)突變是可用的,雖然你會看到許多庫和代碼不使用它。我實際上認爲學習函數式編程在教學上更好,同時關注它如何與副作用進行交互,並且在某種程度上逐漸形成一元式組合。所以我認爲這是一個優勢。但有些人會告訴你,最好首先將Haskell的更加隔離的處理放在mutaton上。

羅伯特哈珀在CMU has some nice blog posts on teaching functional programming。據我所知,他也喜歡OCaml這樣的語言進行教學。

在我推薦的三種語言(純粹,計劃和朋友,OCaml和朋友)中,前兩種語言有動態類型。第一個和第三個有明確的引用單元格(就像在Python中一樣,你限制自己不要重新安排變量,但仍然可以更改存儲在列表索引處的內容)。 Scheme具有隱式引用單元格:變量本身看起來是可變的,就像在C和Python中一樣,並且引用單元格處理在封面下完成。在這樣的語言中,你通常也有一些明確的參考單元格可用(例如我剛剛在Python中給出的例子,或者在Racket中使用可變對/列表......在其他方案中,包括Scheme標準,那些是默認配對/列表)。

Haskell確實擁有的一個優點是一些教科書正在出現。 (我的意思是,這是真誠的,而不是sn。。)使用什麼書籍/資源是另一個有爭議的問題,因爲許多戰爭/封閉的問題。 SICP像其他人所建議的那樣擁有許多粉絲和一些評論家。在我看來,有很多好的選擇。我不會再深入討論這些辯論。

1

這個問題可能是題外話,因爲它會導致無休止的語言之爭,但這裏的建議的總體位:

有一類函數式編程語言,其有時被稱爲「主要功能」 ,因爲它們允許你想要它們的一些必要功能。例子包括Standard ML,OCaml,F#和Scala。如果你想能夠掌握功能性的慣用風格,同時仍然能夠以相當熟悉的方式實現目標,你可以考慮其中的一種。我在過去曾廣泛使用過Standard ML,但如果你正在尋找一些學習曲線較少的東西,我個人推薦Scala,這是我第二喜歡的編程語言。其原因包括圖書館的普及程度,健康規模的社區,以及可用的好書和教程,以幫助您入門(特別是如果您曾與Java進行任何交易)。

+1

我在想,當你想要回退到強制風格的能力可能會成爲學習功能風格的障礙。 – Thilo 2012-07-13 12:14:30

+0

這個問題特別要求「最容易學習」,所以雖然我同意有一個必要的回退可能不是最好的長期戰略,但它確實減少了學習曲線,因此您不必瞭解IO如何工作在一個純粹的設置與其他一切:) – Gian 2012-07-13 12:18:23

+0

是的,我希望這個問題很快就會被關閉。 – dubiousjim 2012-07-13 13:07:37

4

首先閱讀計算機程序的結構和實現。我推薦Lisp(例如,它是方言Scheme)作爲第一個函數式編程語言。

+0

我同意你的建議。我自己從SICP中受益很多,並且進行了練習。我也強烈建議學習SICP。 – weima 2012-07-13 12:32:35

+0

可能的書名是_Structure and Interpretation of Computer Programs_ – ibubi 2017-04-14 07:45:04

2

另一種選擇是Clojure,我可以理解它比Scheme/Racket更「純粹」的功能(請不要問我關於這裏的細節),並且可能足夠類似於讓它與SICP一起使用(計算機程序的結構和解釋,一個強烈推薦的書也由另一個答案建議)。

1

沒有討論過的一個元素是代數數據類型的特殊模式匹配語法的可用性,如Haskell,ML的所有風格,以及可能提及的幾種其他語言。模式匹配語法傾向於幫助程序員將其功能看作數學函數。 Haskell的語法足夠複雜,並且它的實現具有足夠差的解析錯誤消息,該語法是不會選擇Haskell的一個體面的原因。 Scheme可能比大多數其他選項更容易學習(並且Scheme可能具有所有宏系統的王者),但是缺乏模式匹配語法會導致我從功能編程的入門指引中離開它。

+1

我完全同意模式匹配在學習函數式編程中的重要性。我認爲,儘管大多數或所有的選擇都會有或多或少的工作。許多Scheme實現至少將模式匹配作爲擴展;球拍本身就有它。一個與實現無關的版本隨教科書Essentials of Programming Languages分發。無論如何,有人通過Scheme學習FP應該確保利用這些設施。 – dubiousjim 2012-07-16 02:47:35

+1

我的回憶是,在Racket中模式匹配的語法比在ML中使用它的語法更不易讀和可寫。我困惑嗎? Racket沒有代數數據類型的事實(儘管PLAI子語言在僞造數據類型方面做得非常好)使事情變得更糟。 – dfeuer 2012-07-16 06:49:47

+0

@dfeuer當我在Lisp和OCaml之間進行選擇時,我詳細討論了Lisp社區。 Lispers會回答說,Lisp可能沒有代數數據類型,但是它們有宏,可以讓你編寫自己更強大的模式匹配庫,因爲你可以完全統一。然而,模式匹配在OCaml,F#,Haskell和Scala中無處不在,而統一在Lisp,Scheme,Racket和Clojure中幾乎聞所未聞。所以我認爲Lispers失去那一個是公平的。模式匹配非常有價值,這使得ML比Lisps更好。 – 2013-01-27 15:34:43

2

我想學習一種功能語言,以擴大我的視野。我掌握了Python和C/C++的知識,並且我希望語言能夠很容易地從來自語言的必要領域的人那裏學習。我不在乎這種語言是否足夠強大。我只想學習一門語言,以便學習函數式編程的基礎知識,然後我會嘗試一個更困難(和強大的語言)。

好問題!

在20世紀90年代後期開始進行函數式編程之前,我已經完成了BASIC,Pascal,彙編器,C和C++。然後,我幾乎同時開始使用兩種功能語言Mathematica和OCaml,並在幾年內完全使用它們。特別是,OCaml讓我編寫了看起來像我以前寫過的代碼的命令式代碼。作爲學習者,我發現它很有價值,因爲它讓我比較了使ML的優勢顯而易見的不同方法。

但是,正如其他人所提到的,Mathematica和OCaml的核心優勢是模式匹配,並且在技術上與函數式編程沒有關係。我後來看了許多其他功能語言,但我不想回到缺乏模式匹配的語言。

相關問題