【问题标题】:code compatibility between OCaml and F#OCaml 和 F# 之间的代码兼容性
【发布时间】:2011-05-13 10:52:05
【问题描述】:

大家好,

我正在用 OCaml 开发一个小型爱好项目。我想知道将它迁移到 F# 会有多容易。我知道 F# 有一些 OCaml 没有的功能,但我希望我的 OCaml 代码不需要花费太多精力来移植。我不一定要迁移,我想在两个平台上保留/发展。

提前致谢, 迈克尔

【问题讨论】:

标签: f# ocaml


【解决方案1】:

编写交叉编译代码对我来说似乎是一个痛苦的世界。 Coherent PDF 的 John Whitington 是我认识的唯一一个真正尝试过这样做的人。

我已经将很多 OCaml 代码翻译成 F#(可能比世界上任何其他人都多),主要问题是 #light 语法,使用任何非平凡的 OCaml 功能(对象、多态变体、更高-顺序模块、标记和可选参数等)、库(例如lablgl、lablgtk、ocamlgraph、惰性)、宏(解析、流、模式匹配扩展)和基本语法的变化,例如数组索引。例如,我刚刚尝试将 Almabench benchmark 从 OCaml 移植到 F#,这需要几个小时,因为由于 F# 编译器中存在大量错误,我最终不得不手动将每个 a.[i] 重写为 a.(i) : OCaml 兼容模式比较脆弱。

所以我建议您在语言之间进行选择,而不是尝试交叉编译。

【讨论】:

  • 非常感谢。我想避免的是学习一门额外的语言。由于我有 .NET (C#) 的工作知识和 OCaml 的基本知识(来自我的 func。编程课程),我认为 F#(几乎)是给定的。显然不是。 :)
  • 没问题。您可能会发现同时学习 OCaml 和 F# 更多的是帮助而不是阻碍,因为它们非常相似,但您可能会发现它们之间的差异也很有启发性。
【解决方案2】:

您应该阅读规范的最后部分

Features for ML Compatibility

并确保从PowerPack 获取 FSharp.PowerPack.Compatibility.dll 以获取各种兼容库。

【讨论】:

    【解决方案3】:

    我没有对 F# 移植做过任何 OCaml,但我知道 F# 在设计时考虑了 OCaml 兼容性。据我所知,F# 主要是基本 OCaml 的超集。

    它应该支持(并且不限于#light)大多数 OCaml 关键字,并具有核心库(或 .Net 框架)中大多数标准函数的等效项。所以我猜想——至少对于业余项目来说——移植应该很容易。

    F# 没有 OCaml 的高级模块系统,所以你在实现时会遇到麻烦,例如函子。

    【讨论】:

    • 几年前确实如此,但我认为它不再准确了。 F# 中的许多基本内容早已与 OCaml 分道扬镳。例如,索引数组在 OCaml 中是 a.(i),但在 F# 中是带有类型注释的 a.[i]。 OCaml 在浮点数上的基本算术运算符(+.*. 等)在 F# 中不再正常工作。
    • F# 主要不是 OCaml 的超集,而是具有一些扩展(活动模式等)的子集。 Jon 的回答列出了 F# 不支持的 OCaml 的一些特性。
    猜你喜欢
    • 2015-06-27
    • 2013-11-06
    • 1970-01-01
    • 2017-03-27
    • 2019-12-27
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多