比较 F# 和 OCaml

comparing F# and OCaml

我大致知道 F# 和 OCaml 在 "features" 方面有何不同(例如仿函数、camlp4、度量单位...)。

我想知道以下问题:关于不包含所述功能的代码,F# 和 OCaml 之间的编码风格(除了命名约定之外)是否存在差异?换句话说,如果一些(惯用的)F# 代码可以直接(可能是平凡的)翻译成 OCaml,这种转换是否一定会导致惯用的 Ocaml?

编辑:根据 Guy Coder 提供的链接,我猜某些 "idiomatic" OCaml 代码可能不会直接转换为 "idiomatic" F# 代码,因为 F# 中的异常要慢得多(并且在 OCaml 中使用更广泛)。另一个方向呢?某些 F#ish OCaml 代码是否会根据 "Don't do XX that way, the OCaml way to do XX is with exceptions instead of XY.."

引起反应?

一般来说,与 F# 中的典型用法相比,在 OCaml 中使用异常有何不同。是否有其他结构在两种语言中使用不同(例如,由于一种语言的性能损失)?

是的,大多数 OCaml 用户认为翻译是地道的。由于惯用不是一个精确的标准,因此无法衡量惯用程度。

需要注意的是,您必须修改一些代码才能使用一种语言中没有的功能,而另一种语言中没有。特别是如果仿函数是在 OCaml 中执行此操作的惯用方式,那么您必须将 F# 代码转换为仿函数。或者,如果 F# 广泛使用了 .Net 库代码,那么您将不得不在 OCaml 中重新创建这些函数或找到等效函数。

我已经将我的 ML 和 OCaml 部分翻译成 F#,正如你所注意到的,我所说的环境和精神才是真正的大区别,例如仿函数、camlp4、度量单位、Visual Studio、时间旅行、NUnit、WPF 等

请记住,F# 在移植时以 OCaml 开始,因此在大多数情况下仍有很多共同点。

如果您想查看在 OCaml 和 F# 中完成的大量代码,几乎逐行翻译,请查看 John Harrison "Handbook of Practical Logic and Automated Reasoning" 的代码

F#

OCaml

那你自己判断吧

我必须注意 "Handbook of Practical Logic and Automated Reasoning" 的代码没有使用 类、记录、事件等。它几乎是纯函数。

另一种比较任何两种语言的惯用性(好的,所以我创造了这个词)的方法是使用 Rosetta Code. Rosetta Code contains solutions to programming task written in many languages. So find a programming task, e.g. create a class and then look at the OCaml and F# 版本。

并非所有任务都以所有语言完成,但任何人都可以贡献甚至建议新任务。