OCaml or Haskell?
因為工作中不久的將來要做形式化方法的應用,所以琢磨著得先自動學起來,然後問題就來了,OCaml還是Haskell?
就目前的項目來說,OCaml很可能會是最終在項目里會使用的語言,因為首先要和C++的現有代碼結合,這兩個兩者似乎都可以做到,第二要求是以嵌入腳本的形式存在,去Stakeoverflow上調查一下,似乎OCaml在執行腳本上面優勢比Haskell好一些。然後我現在面前有兩本書,O"Reilly的兩本,挑哪本入門比較適合容易接受函數式編程的思想?如果學會了用其中一個語言編寫程序,轉到另外一個應該也不會很困難吧?還有項目是有CENELEC EN 50128認證要求的,所以是要純的函數式程序,不引入對象之類的東西。。
推薦一個視頻
http://www.youtube.com/watch?v=4S6aGP23qSQ個人體會(比較亂)
Ocaml語法較之Haskell更「簡陋」,也更接近C Style語言,上手會相對快一點。對於初學者,會覺得Haskell更「炫酷」,但是做稍大的項目可能不容易適應。
關於函數式編程思想,Haskell比較「極端」,但是習慣了的話再看其他函數式語言就豁然開朗了。Ocaml偏向混合範式,比如容易ref類型亂飛,它的「面向對象」倒不是問題。
Haskell社區x格高,Hackage有很多有探索性、開創性的拓展庫,涉及響應式編程、自動化測試、程序語言理論等。而Ocaml更適合hack,做大型系統(可能是因為語法「底層」和」高層抽象「通吃吧。)。據我所知,CMU CyLab用Ocaml實現了一個二級制分析的框架。Stanford搞SUIF的那個Lab(似乎。。)也會用Ocaml做一些編譯基礎設施
形式化相關的,有用Ocaml實現的Coq,雖然Haskell也有類似的Idris,Agda,不過Coq更成熟,文檔、社區支持可能要更好。
打個不太恰當的比方,Haskell之於Ocaml, 好比Ruby之於Python,Clojure之於Scheme。
學習東西/娛樂:用Haskell。比較急著用來幹活的話,選Ocaml。不論如何,Haskell都得學一學。之前沒有任何函數式編程經驗的話最好還是先學一下Scheme,然後讀一下《The Little Schemer》系列,習慣用遞歸來表達思想。
接下來讀《The Little MLer》,學會用Algebraic Data Type 來表達思想。
最後無論你用OCaml還是Haskell都必須學Haskell,因為初學者的固有思維會在有ref的情況下很難改變,學Haskell能讓你寫出真正的函數式代碼。看看《Monads for functional programming》你就明白了。兩者都用類型系統幫助標記副作用:haskell用Monad ,在數學上更優美,Ocaml只是簡單地Wrap一下(ref,mutable , :=)。
Haskell 的標準庫比Ocaml好用,type class 支持 operator overloadding ,非常方便,而Ocaml 對於不同類型必須使用不同函數名,比如整數加法是+,浮點數的加法 "+."
Ocaml 的Record更好用,module system 實現modularity更可控,haskell 的instances for type class 靠編譯器自動推導。
個人認為兩者都算比較「純」 的函數式語言,Ocaml 中的Object system 更像另一個Module system,和面向對象關係不大
Monad:我認為這是一種非常有用的抽象,要愉快的使用幾乎只能在haskell 中。
腳本方面不知道是指的什麼,runhaskell 可以直接解釋運行 .hs
語法方面各有好壞,一般認為Ocaml的語法更啰嗦,但是它的函數定義也可以寫成 let add:int-&>int-&>int = fun x y-&> ... 這樣的形式而不是 let add (x:int) (y:int) : int-&>... (後者看著確實丑。。)。定義類型的時候,Ocaml都是用關鍵詞"type" ,而haskell 有 newtype,data 雖然對應不同的作用但是感覺有點亂,還有就是類型標記haskell 是 :: ,這裡不太優美。還有ocaml 寫Lambda時要寫 fun 而haskell只需要寫 ,這裡前者確實啰嗦
綜上,本人還是更喜歡haskell
Haskell 可以學點好的抽象 type theory. 但是實際幹活並不理想 最典型的最近Simon 去Fb 搞得那個spam花了那麼多精力 效率其實每提高多少. 還有比如haskell社區搞得ghcjs花了那麼久還不如我幾個周末搞的效果好... 主要是Haskell 解決了很多問題 同時也製造了很多問題
工作要求的話,應該OCaml好些。Haskell做混合項目好麻煩……不過學習的話建議Haskell入手,這樣換其它語言會發現「不做那些類型計算好輕鬆……」
謝謝所有人的回答。這兩天工作開始用這些了。
可是為什麼沒有人提到,OCaml在windows下的支持很差勁啊,OPAM...推薦閱讀:
※Comonad有什麼實際用途?
※該如何理解Monad?
※學過Haskell是一種怎樣的體驗?
※PureScript 是什麼?有什麼特性
※精通 Haskell 是一種怎樣的體驗?