比较F#和OCaml

时间:2016-04-20 18:56:09

标签: f# ocaml

我大致了解F#和OCaml在"功能和#34;方面的差异。 (例如,仿函数,camlp4,计量单位......)。

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

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

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

1 个答案:

答案 0 :(得分:13)

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

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

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

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

如果你想看到在OCaml中完成的大量代码,并且F#几乎在线上翻译,请查看"实用逻辑和自动推理手册"作者:John Harrison

F#

OCaml

然后你可以自己判断。

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

另一种比较任何两种语言的一般方法就是使用Rosetta Code来表达idomaticness(好吧我创造了这个词)。 Rosetta代码包含用多种语言编写的programming task解决方案。所以找一个编程任务,例如create a class然后查看OCamlF#版本。

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