我大致知道F#和OCaml在"特征"方面的差异(例如,仿函数,camlp4,度量单位......).
我想知道以下内容:关于不包含所述功能的代码,F#和OCaml之间的编码风格(除了命名约定之外)是否存在差异?换句话说,如果某些(惯用的)F#代码能够以直接的方式(可能是简单的)转换为OCaml,那么这种转换是否必然导致惯用的Ocaml?
编辑:从Guy Coder提供的链接我猜想一些"惯用的"OCaml代码可能不会直接转换为"惯用的"F#代码,因为F#中的异常要慢很多(并且在OCaml中使用得更广泛).另一个方向呢?一些F#ish OCaml代码会引发一种反应:"不要这样做XX,OCaml做XX的方式是异常而不是XY ......"
通常,与F#中的典型用法相比,在OCaml中使用异常有何不同.是否存在在两种语言中使用不同的其他结构(例如,由于一种语言中的性能损失)?
Guy*_*der 16
是的,大多数OCaml用户认为翻译将被视为惯用语.由于惯用语不是一个确切的标准,因此无法衡量惯用语.
需要注意的是,您必须修改一些代码才能使用一种语言中不存在另一种语言的功能.特别是如果仿函数是在OCaml中执行它的惯用方法,那么您必须将F#代码转换为Functor.或者,如果F#广泛使用.Net库代码,那么您必须在OCaml中重新创建这些函数或找到等效函数.
我已经将我和ML和OCaml的份额翻译成了F#,正如你所说,我所说的环境和精神是真正的重大差异,例如,仿函数,camlp4,度量单位,Visual Studio,时间旅行,NUnit ,WPF等
请记住,F#在移植时以OCaml开头,所以在大多数情况下仍有很多共同点.
如果你想在OCaml中看到一些重要的代码,并且F#被翻译成几行代码,请看看John Harrison的"实用逻辑和自动推理手册"的代码
然后你可以自己判断.
我必须注意,"实用逻辑和自动推理手册"的代码不使用类,记录,事件等.它几乎是纯粹的功能.
比较任何两种语言的另一种方法是一般的idomaticness(好的,所以我创造了这个词)是使用Rosetta Code.Rosetta Code包含以多种语言编写的编程任务的解决方案.因此,找一个编程任务,例如创建一个类,然后查看OCaml和F#版本.
并非所有任务都在所有语言中完成,但任何人都可以贡献甚至建议新任务.