2009-11-15 64 views
2

鑑於角色在從C到JAVA的不同命令式編程語言中擁有豐富的經驗。函數式編程語言如Haskell的學習曲線是什麼?學習函數式編程語言有多困難?

+3

那真的取決於人,不是嗎? – 2009-11-15 21:31:32

+2

+重新打開:如果您不想看到主觀問題,請將其添加到您的忽略列表中。我們其他人,尤其是FP新手,可能會從這樣的問題中得到一些有用的見解。 – Juliet 2009-11-15 21:45:41

+0

這個問題不夠具體,不足以提供很好的答案。你如何衡量學習曲線?但我認爲這不是特別的「議論性的」,這是「主觀的和議論性的」接近選擇的觀點;它應該是爲了防止火焰戰爭,而不是關閉一些模糊的問題。 – 2009-11-15 22:03:30

回答

2

從像C,Java中的程序或面嚮對象語言的link

用戶執行的,但是還是Python的應該當心,:你必須忘掉大部分你已經知道有關編程。 Haskell與這些語言完全不同,並且需要對編程有不同的思考方式。最好在本教程中加入一個空白頁面,並儘量不要將Haskell與命令式語言進行比較,因爲它們中的許多概念(類,函數,返回)在Haskell中具有明顯不同的含義。

+1

我總結一下,如果你是FP的初學者,你必須堅信自己在編程本身就是初學者。 – user210767 2009-11-21 14:00:09

2

我還沒有開發任何實用的函數式編程語言,但沒有很大的麻煩適應它。

在開始之前,我建議遞歸地改進你的思維,因爲這就是你需要做的事情,無論是熟悉還是陌生的語言。另外,您需要適應功能是對象的想法,您可以將它們傳遞給函數,並且函數可以返回它們。

+2

我認爲Java很快就會成爲沒有頭等功能的唯一主流語言。幾乎所有我能想到的主要語言都有或正在增加它們; JavaScript,C#,Perl,Ruby,Python,C(帶Apple的塊),C++ 0x的lambda表達式。因此,您應該瞭解您是否使用函數式語言進行編程。 – 2009-11-15 21:33:01

4

在接受Haskell之前,你可能會發現學習一些不是純粹是功能的東西比較容易,就像Lisp或ML一樣。鑑於您的Java體驗,Clojure(運行在JVM上的Lisp)可能是一個很好的開始。

+0

我第二個這個建議...我一直在學習OCaml作爲Haskell的墊腳石。同樣在JVM上的Scala也可能是一個很好的建議 - 它是鍵入的並且具有模式匹配。 – aneccodeal 2009-11-15 21:32:38

+0

我最不贊同。純粹功能性的語言將使初學者保持直線和狹窄。 LISP和ML變體會讓你撒謊,欺騙和思考不純的想法。如果您想快速學習FP,請使用Haskell或Clean。 – Apocalisp 2009-11-15 23:54:05

+0

@Apocalisp我對Haskell編寫的開源項目進行了一次調查,發現大多數情況下使用'unsafePerformIO'這類的東西來規避類型系統,以故意引入不受控制的副作用。 – 2012-06-05 13:06:38

2

Haskell的學習曲線比其他功能語言(如OCaml)稍高一些,儘管它是我個人的最愛。

國際海事組織的關鍵是從構成,投入和產出角度思考(如果你來自面向對象,你可能認爲幾乎完全是在繼承方面 - 這會妨礙你的學習)。

嘗試將純粹的(無副作用)與不純(副作用 - 示例IO,狀態等)分開。

請記住,功能是一流的公民。

並學習部分功能應用的技巧。一旦你習慣了它,它非常方便。

4

就像OP一樣,在跳到2006年前後的功能性編程之前,我來自OOP /命令式背景。

我有很多 C#和Java在我的腰帶下,並想學習一種新的語言。我開始使用Python,接受Perl,並在C++上削減我的牙齒。這一切都很好,很花哨,但沒有什麼新東西要學,我基本上是用一種不同的語法重複學習同一種語言。無意中,我偶然發現了Paul Graham的經典文章Beating the Averages,他在那裏談論了Lisp和函數式編程。

我認爲學習其中一種「晦澀」的函數式編程語言會很有趣。所以,在Erlang,Lisp,Haskell和OCaml之間,我沒有特別的理由拿起OCaml,除了駱駝很可愛(完全!)。很多新東西要與這裏奮鬥:

  • Graaaaah,爲什麼我必須與編譯器對抗,以使type-in​​ference工作正確?
  • Arrrragh,爲什麼沒有這種語言體面的IDE?爲什麼emacs沒有GUI編輯器?我的智能在哪裏!
  • 柯里?這只是一個噱頭,還是它應該是有用的? Waaaaah,我怎麼能用代數數據類型做任何實際的事情?
  • [] -> ... | x::xs -> ...,WTF的意思是?

對於我來說,從Java移動到Python是容易的:類似的建築成語,類似的編程風格等最難的部分是真的學習一種新的圖書館,這需要所有6個星期從的n00b去親。

從Java移動到OCaml的是真的真的很難,因爲沒有什麼基礎上,它就像從步驟0開始用了約6個月的語言之前我停了下來,現在怎麼對自己說「周圍胡扯的我是否會在OCaml中執行此操作?

回想起來,我可能不會像從Haskell開始一樣掙扎。可選的可變性+ OOP使OCaml看起來像熟悉的領域一樣,單子對我來說仍然是一個謎。