问题 比较F#和OCaml


我大致知道F#和OCaml在“特征”方面的差异(例如,仿函数,camlp4,度量单位......)。

我想知道以下内容:关于不包含所述功能的代码,F#和OCaml之间的编码风格(除了命名约定之外)是否存在差异?换句话说,如果某些(惯用的)F#代码能够以直接的方式(可能是琐碎的)翻译成OCaml,那么这种转换是否必然会导致惯用的Ocaml?

编辑:从Guy Coder提供的链接我猜想一些“惯用的”OCaml代码可能不会直接转换为“惯用的”F#代码,因为F#中的异常要慢很多(并且在OCaml中使用得更广泛)。另一个方向呢?一些F#ish OCaml代码会引发一种反应:“不要那样做XX,OCaml做XX的方式是异常而不是XY ......”

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


4848
2018-04-20 18:56


起源

感谢您花时间真正探索这个问题,而不仅仅是简单的一瞥并查看我提供的链接。我没有主动使用OCaml,所以我可以提供的内容存在漏洞但是我不相信使用选项类型而不是异常不会是惯用的,我看到使用异常作为ML的保留。 - Guy Coder
如果你用我所掌握的知识来更深入地理解这个问题,那么你不得不只关注F#和OCaml,而是整个ML系列,ML,CAML,OCaml和F#。我相信CAML不再活跃,甚至不再用于主流,但我出于历史原因将其包括在内。 - Guy Coder
如果您真的想了解更多细节,请尝试联系成员 ICFP 要么 CUFP 因为我不是其中任何一个的成员。 - Guy Coder
您可能会感兴趣的更多链接来自我提出的有关将OCaml转换为F#的问题。看我的 问题 从一开始 Converting OCaml to F#: - Guy Coder
Are there other constructs that are differently used in the two languages 正如我在回答中所指出的那样,最大的问题是图书馆和环境的差异,例如: .Net 和 Visual Studio 与 batteries included。类型系统也是人们必须更详细地理解的东西。我知道一个很好的详细页面,但目前我找不到我的参考,但这是我的一些评论。也 乔恩哈罗普 因为他在咨询中多年使用这两种语言,所以可以提供更好的答案。 - Guy Coder


答案:


是的,大多数OCaml用户认为翻译将被视为惯用语。由于惯用语不是一个确切的标准,因此无法衡量惯用语。

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

我已经将我和ML和OCaml的份额翻译成了F#,正如你所说,我所说的环境和精神是真正的重大差异,例如:仿函数,camlp4,度量单位,Visual Studio,时间旅行,NUnit,WPF等。

请记住,F#在移植时以OCaml开头,因此大多数情况下还有很多共同之处。

如果你想看到在OCaml和F#中完成的大量代码已经完成了几行换行,请看看John Harrison的“实用逻辑和自动推理手册”的代码

F# 

OCaml的

然后你可以自己判断。

我必须注意“实用逻辑和自动推理手册”的代码不使用类,记录,事件等。它几乎是纯粹的功能。

比较任何两种语言的另一种方法是使用idomaticness(好的,所以我创造了这个词) 罗塞塔代码。 Rosetta Code包含解决方案 编程任务 用多种语言写的。所以找一个编程任务,例如 创建一个类 然后看看 OCaml的 和 F# 版本。

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


11
2018-04-20 19:53



这个单词 习语 并不是那么被接受,但它在Google上的受欢迎程度似乎是这个词的两倍 idiomacity,我来使用。这两个词似乎主要由语言学家和计算机科学家使用,所以我不会对这些圈子中的使用感到沮丧,尽管 习语 听起来像缺乏一个 -itude。 :-P - Simon Shine
感谢您的回答。请看我的编辑。 - D.F.F
出于兴趣: 广义代数数据类型 和 OCaml语言扩展:广义代数数据类型 - Guy Coder