F# 转换为 OCaml

130
F#源自OCaml,但有哪些重要的元素缺失或添加了呢?具体来说,我想知道学习OCaml的资源对于想学习F#的人是否也有用。

4
这是一篇从OCaml开发者角度的比较,因此有一定偏见,但仍然很有用。 - Mauricio Scheffer
10
注意:如果您对这个问题的命运感兴趣,请参与 Meta Stack Overflow 上的讨论或在 chat 中讨论 - 这里的评论非常没有成效,所以我已经将它们删除了。 - Shog9
1
@MauricioScheffer 链接失效了! - J D
4
@JonHarrop 我认为这个链接可能是更新的版本。(由中田景子撰写) - Bart
4个回答

126
这个问题早已有答案,但我很惊讶大多数回答都说了F#缺少哪些OCaml功能-如果您想将现有的OCaml程序移植到F#中(这可能是大多数参考文章的动机),那么这绝对是有价值的。然而,有许多特性使F#成为一种不同的语言(不仅仅是.NET的OCaml限制版本!)以下是F#新增的一些内容:

  • 度量单位允许您在处理数字计算的代码中进行类型检查
  • 元编程使用引用(这使得在F#中使用LINQ成为可能,并且对于像WebSharper平台这样的有前途的项目也是必不可少的)
  • 活动模式用于创建函数数据类型的抽象(也是更复杂的模式匹配应用程序的非常有用的功能)
  • 计算表达式是支持异步工作流程的语言特性(用于异步I/O /网络服务/ GUI编程的库)
  • .NET兼容对象系统使其能够完全与.NET平台互操作(OCaml也支持对象,但不同-当然,两个系统都有一些好处)。
  • 重载运算符-据我所知,OCaml没有重载运算符-在F#中,您可以使用 + 处理所有数值类型以及支持它的类型。

而且,说实话,我认为值得一提的还有Visual Studio IDE。这不是语言的一部分,但它确实提高了用户体验(Visual Studio中的IntelliSense支持真的很好!)

如果您查看列表,会发现有很多因素极大地促进了F#的流行,所以它不仅仅是“没有functor的OCaml”。F#确实基于OCaml(并借鉴了其他语言如Haskell的思想),并与它们分享许多方面,但也有很多其他的因素。我猜如果没有像异步工作流、.NET风格的面向对象和元编程之类的东西,微软开发人员部门绝不会在Visual Studio 2010中包含F#。

18
哇!OCaml是专为元编程而生的,它在这方面比F#和.NET更加出色。 Camlp4比F#的引用系统更加强大。 OCaml的词法分析器和解析器远远优于任何可用于.NET的工具。此外,可用Camlp4宏来实现活动模式和计算表达式。与F#相同,OCaml也有提供类似Visual Studio的IDE,带来相同的好处。 - J D
6
F# 引用(quotations)的目标与 Camlp4 提供的内容完全不同,虽然这不是 OCaml 语言本身,而是在其之上构建的系统。因此,将它们进行比较是不公平的。Camlp4 的存在确实是 OCaml 的一个优势,但它与引用并没有任何关系(引用允许像 WebSharper、在 GPU 上运行 F# 等操作)。 - Tomas Petricek
12
你如何调和你的说法,即Camlp4“是建立在”OCaml之上的系统,而事实上Camlp4是与OCaml在二进制级别集成的,并且可以在运行中的OCaml REPL中定义和使用Camlp4宏?你如何调和你的说法,即Camlp4“与引用无关”,而事实上Camlp4提供了引用机制?你如何调和你的暗示,即Camlp4无法促进像Websharper这样的工具,而SkyDeck的ocamljs工具自2007年以来一直在编译使用Camlp4引用的OCaml代码到Javascript的事实呢? - J D
6
@Tomas: F#无法引用带有未绑定变量的表达式,例如 <@ a @>,更不用说类型定义如 <@ type t = int @>。它也不能处理任意的语法,更不用说像Camlp4那样可扩展的词法分析器和语法分析器。缺乏一个良好的宏系统是其中之一的缺点,但在我看来,F#缺乏优秀的词法分析器和语法分析器是一个更为严重的障碍。我实际上建议开发人员使用OCaml创建他们的词法分析器和语法分析器,限制自己使用F#支持的子集,并将其移植回F#以受益于OCaml更出色的工具支持! - J D
8
@Erik: "大多数人关注 F# 缺失的内容,但我也想看看 OCaml 缺少什么。" 需要注意的是,活动模式、元编程、计算表达式和异步工作流在它们被引入 F# 之前就已经在 OCaml 中可用了。 - J D
显示剩余4条评论

93
主要的区别在于 F# 不支持以下内容:
  • functors
  • OCaml 式对象
  • 多态变量
  • camlp4/5 预处理器或扩展点 (ppx)
此外,F# 对带标签和可选参数有不同的语法。
理论上,没有使用这些特性的 OCaml 程序可以使用 F# 编译。学习 OCaml 是了解 F# 的完全合理的入门方式(反之亦然,我想象中是这样的)。
完整的区别列表在 这里(注意:存档网站替换了失效的链接)。

3
有没有 F# 的 camlp4 等效工具? - nlucaroni
不太可能。但是你可以通过camlp4将程序导入F#编译器中,不过我不建议这样做。 - Chris Conway
6
F#确实具有命名参数和可选参数,但它使用不同的语法和语义。你在使用Camlp4与F#时可能会遇到麻烦,因为F#几乎总是对缩进敏感,所以它需要一个新的词法分析器,而关于词法分析器的Camlp4文档已经空置了近两年。 - J D
1
我听说微软不想在F#中添加类似于camlp4的功能,因为他们担心这样的功能可能会鼓励人们开始使用除Microsoft Visual Studio之外的开发环境。 - chrismamo1

12

F#和OCaml是ML语言家族中的分类,该家族还包括其他一大堆奇怪的动物。 F#比OCaml更新,并且它尚未具备functor(模块->模块的函数)或row type(对象类和多态变体)。在这两者之间,这两种简化可能会使在.Net平台上开发的人的学习曲线更加容易。不幸的是,这两个语言特性在OCaml中非常强大,因此阅读OCaml文献以获取有关如何为F#编码的见解可能会导致对后者的过早挫败,而F#在那些可用的情况下可能是C#的绝佳替代品。


4

1
"F# 直接支持 OCaml 语法。虽然可能不是百分之百兼容,但我认为它非常接近。但 F# 编译器对 OCaml 兼容性的支持非常有缺陷。这可能会导致在将现有的 OCaml 代码库移植到 F# 时出现困难,因为 F# 编译器会在有效代码上内部崩溃。" - J D
1
所有的链接都已失效。 - Wingjam

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