【发布时间】:2011-05-13 10:52:05
【问题描述】:
大家好,
我正在用 OCaml 开发一个小型爱好项目。我想知道将它迁移到 F# 会有多容易。我知道 F# 有一些 OCaml 没有的功能,但我希望我的 OCaml 代码不需要花费太多精力来移植。我不一定要迁移,我想在两个平台上保留/发展。
提前致谢, 迈克尔
【问题讨论】:
大家好,
我正在用 OCaml 开发一个小型爱好项目。我想知道将它迁移到 F# 会有多容易。我知道 F# 有一些 OCaml 没有的功能,但我希望我的 OCaml 代码不需要花费太多精力来移植。我不一定要迁移,我想在两个平台上保留/发展。
提前致谢, 迈克尔
【问题讨论】:
编写交叉编译代码对我来说似乎是一个痛苦的世界。 Coherent PDF 的 John Whitington 是我认识的唯一一个真正尝试过这样做的人。
我已经将很多 OCaml 代码翻译成 F#(可能比世界上任何其他人都多),主要问题是 #light 语法,使用任何非平凡的 OCaml 功能(对象、多态变体、更高-顺序模块、标记和可选参数等)、库(例如lablgl、lablgtk、ocamlgraph、惰性)、宏(解析、流、模式匹配扩展)和基本语法的变化,例如数组索引。例如,我刚刚尝试将 Almabench benchmark 从 OCaml 移植到 F#,这需要几个小时,因为由于 F# 编译器中存在大量错误,我最终不得不手动将每个 a.[i] 重写为 a.(i) : OCaml 兼容模式比较脆弱。
所以我建议您在语言之间进行选择,而不是尝试交叉编译。
【讨论】:
您应该阅读规范的最后部分
并确保从PowerPack 获取 FSharp.PowerPack.Compatibility.dll 以获取各种兼容库。
【讨论】:
我没有对 F# 移植做过任何 OCaml,但我知道 F# 在设计时考虑了 OCaml 兼容性。据我所知,F# 主要是基本 OCaml 的超集。
它应该支持(并且不限于#light)大多数 OCaml 关键字,并具有核心库(或 .Net 框架)中大多数标准函数的等效项。所以我猜想——至少对于业余项目来说——移植应该很容易。
F# 没有 OCaml 的高级模块系统,所以你在实现时会遇到麻烦,例如函子。
【讨论】:
a.(i),但在 F# 中是带有类型注释的 a.[i]。 OCaml 在浮点数上的基本算术运算符(+.、*. 等)在 F# 中不再正常工作。