2010-11-21 78 views
16

好日子全部,OCaml和F#之間的代碼兼容性#

我正在OCaml開發一個小型的愛好項目。我想知道將它遷移到F#是多麼容易。我知道F#有一些OCaml沒有的功能,但我希望我的OCaml代碼只需要很少的努力就可以移植。我不一定要遷移,我想在兩個平臺上保留/開發。

由於提前, 邁克爾

+2

你應該看到http://stackoverflow.com/questions/179492/f-and-ocaml – 2010-11-21 18:43:59

回答

0

我沒有做過任何的OCaml到F#-porting,但我知道F#的設計充分考慮OCaml的兼容性。據我所知,F#主要是基本OCaml的超集。

它應該支持(並且沒有#light限於)大多數OCaml關鍵字,並且具有核心庫(或.Net框架)中大多數標準函數的等價物。所以我想 - 至少對於愛好項目 - 移植應該很簡單。雖然F#沒有OCaml的高級模塊系統,所以你在實現時會遇到麻煩。函子。

+0

這是幾年前,但我認爲它不再是準確的。 F#中很多基本的東西早已與OCaml分道揚long。例如,索引一個數組是'a。(i)'在OCaml中,但'a。[i]'在F#中有一個類型註釋。 OCaml基於浮點數('+。,*,*等)的算術運算符在F#中不再正常工作。 – 2011-02-26 13:27:26

+1

F#不是OCaml的超集,而是帶有一些擴展(活動模式等)的子集。 Jon的答案列出了F#不支持的OCaml的一些功能。 – 2012-02-20 09:03:41

13

編寫交叉編譯代碼對我來說看起來像一個痛苦的世界。 Coherent PDF的John Whitington是我所知道的唯一一個曾試圖做到這一點的人。我已經將很多OCaml代碼翻譯成F#(可能比世界上任何其他人都多),主要問題是語法,使用任何非平凡的OCaml特性(對象,多態變體,高階模塊,標記和可選參數等),庫(例如lablgl,lablgtk,ocamlgraph,laziness),宏(解析,流,模式匹配擴展)以及基本語法(如數組索引)的更改。例如,我試圖將0123am從OCaml移植到F#,並花了幾個小時,因爲我最終不得不手動重寫每個a.[i]a.(i),因爲F#編譯器中存在大量的錯誤:它的OCaml兼容模式是相當脆弱。

所以我建議你選擇語言而不是嘗試交叉編譯。

+0

非常感謝。我想避免的是學習一門額外的語言。由於我具有.NET(C#)的工作知識和OCaml的基本知識(來自我的func編程課程),但我認爲F#是(幾乎)給定的。顯然它不是。 :) – user515232 2010-11-21 20:24:31

+1

沒問題。你可能會發現它更像是一種幫助,而不是同時學習OCaml和F#的障礙,因爲它們非常相似,但你可能會發現它們之間的差異也非常有啓發性。 – 2010-11-21 23:11:14