比较F#和OCaml

24

我大致了解 F# 和 OCaml 在“特性”方面的差异(例如,functors、camlp4、度量单位等)。

我想知道以下内容:对于不包含上述特性的代码,F# 和 OCaml 在编码风格方面是否有区别(除了命名约定之外)?换句话说,如果某些(惯用的)F# 代码可以以直接的方式(或许是微不足道的)转换成 OCaml,这种转换是否一定会导致惯用的 OCaml 代码?

编辑:根据 Guy Coder 提供的链接,我猜出一些“惯用”的 OCaml 代码可能无法直接转换为“惯用”的 F# 代码,因为在 F# 中异常的速度要慢得多(而在 OCaml 中更广泛地使用)。另一方面呢?某些 F# 风格的 OCaml 代码会引起类似“不要以那种方式做 XX,OCaml 中做 XX 的方式是使用异常而不是 XY…”的反应吗?

一般来说,OCaml 使用异常的差异如何与 F# 的典型用法进行比较?两种语言中是否有其他不同的结构(例如由于一种语言的性能损失而导致在另一种语言中被不同地使用)?


要真正深入地理解这个问题,如果你以我的知识来看待它,那么你不仅仅要看 F# 和 OCaml,还要看整个 ML 家族,ML、CAML、OCaml 和 F#。我相信 CAML 在主流领域已经不再活跃或被使用了,但出于历史原因我还是将其包括在内。 - Guy Coder
如果您真的想要更多的细节信息,请尝试联系ICFPCUFP的成员,因为我不是其中的成员。 - Guy Coder
你可能会对我提出的有关将OCaml转换为F#的问题感兴趣,以下是更多相关链接。请查看以Converting OCaml to F#:开头的我的问题 - Guy Coder
在两种语言中是否有其他不同使用的结构?正如我在答案中提到的,最大的区别在于库和环境,例如.NetVisual Studio与“内置电池”的区别。类型系统也是必须更详细地了解的内容。我知道有一篇很好的详细页面,但我目前找不到我的参考资料,但它在我的一些SO评论中。此外,Jon Harrop可以给出更好的答案,因为他在咨询中已经使用这两种语言多年了。 - Guy Coder
我从OCaml和ML移植的所有F#代码都已经移植并修复了编译器错误,将F#代码导航到惯用的F#代码。如果反过来也是这样,我不会感到惊讶。然而,仅通过修复编译器错误将C#移植到F#代码,并不总是产生惯用的F#代码,在我看来。我看到有些从C#移植过来的代码永远不应该见天日,特别是对于学习函数式编程的人。 - Guy Coder
显示剩余6条评论
1个回答

23

是的,对于大多数OCaml用户来说,这种翻译在很大程度上会被认为是习惯用语。由于习惯用语不是一个确切的标准,因此无法衡量其习惯用语程度。

需要注意的是,您将不得不修改一些代码,以利用一种语言中另一种语言没有的功能。特别是如果functor是在OCaml中惯用的方法,则您必须将F#代码转换为Functor。或者,如果F#广泛使用.Net库代码,则必须在OCaml中重新创建这些函数或找到相应的函数。

我已经将我的部分ML和OCaml翻译成了F#,正如您所指出的,环境和精神氛围才是真正的差异,例如:functors、camlp4、计量单位、Visual Studio、时间旅行、NUnit、WPF等。

请记住,当F#被移植时,它是从OCaml开始的,因此在很大程度上仍然有许多共同点。

如果您想看到用OCaml和F#编写的大量代码几乎逐行翻译,请查看John Harrison的“实用逻辑和自动推理手册”代码。

F#

OCaml

然后您可以自己判断。

我必须指出,“实用逻辑和自动推理手册”的代码不使用类、记录、事件等。它几乎纯粹是函数。

另一种比较任意两种语言的惯用性(好吧,我创造了这个词)的方法是使用Rosetta Code。Rosetta Code 包含了许多语言编写的编程任务的解决方案。所以找到一个编程任务,例如创建一个类,然后查看OCamlF#版本。

并不是所有的任务都在所有语言中完成,但任何人都可以贡献或提出新的任务建议。


2
“idiomaticness”这个词并不是很被接受,但在谷歌上似乎比我所使用的“idiomacity”流行大约两倍。这两个词似乎主要被语言学家和计算机科学家使用,因此我不会对这些领域内的使用表示反感,尽管“idiomaticness”听起来好像缺少一个“-itude”。:-P - sshine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接