F# 更改为 OCaml [已关闭]

问题描述 投票:0回答:4

F# 源自 OCaml,但是缺少或添加了哪些主要项目?差异是否足够小,以便用于学习 OCaml 的资源对于想要学习 F# 的人也有用?

f# ocaml functor
4个回答
125
投票

这个问题已经回答了一段时间了,但令我感到非常惊讶的是,大多数答案都说 F# 中缺少哪些 OCaml 功能 - 如果您想将现有的 OCaml 程序移植到 F#(这可能是大多数参考文章的动机)。然而,有许多功能使 F# 成为一种不同的语言(不仅仅是 .NET 的 OCaml 的有限版本!)以下是 F# 中添加的一些内容:

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

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

如果你看一下这个列表,就会发现有很多东西在很大程度上促成了 F# 的流行,所以它不仅仅是“没有函子的 OCaml”。 F# 绝对基于 OCaml(并借鉴了 Haskell 等其他语言的思想),并与它们共享许多方面,但也有很多其他的东西。我猜想,如果没有异步工作流程、.NET 风格的 OO 和元编程之类的东西,Microsoft 开发部门永远不会在 Visual Studio 2010 中包含 F#。


92
投票

主要区别是 F# 不支持:

  • 函子
  • OCaml 风格的对象
  • 多态变体
  • camlp4/5 预处理器或扩展点 (ppx)

此外,F# 对于标记参数和可选参数具有不同的语法。

理论上,不使用这些功能的 OCaml 程序可以使用 F# 进行编译。学习 OCaml 是对 F# 的完美合理的介绍(我想反之亦然)。

完整的差异列表在这里(注意:archive.org 替换了死链接)。


12
投票

F# 和 OCaml 在分类学上属于 ML 语言家族,其中还包括一整套其他奇怪的动物。 F# 比 OCaml 更新,而且它还没有函子 [模块的函数 -> 模块] 或行类型 [对象类和多态变体]。对于在 .Net 平台上进行开发的人来说,这两种简化可能会使学习曲线变得更容易。遗憾的是,这两种语言功能在 OCaml 中非常强大,因此阅读 OCaml 文献以深入了解如何为 F# 进行编码可能会导致过早地对后者感到沮丧,因为后者可能是 C# 的绝佳替代品(两者都可用)。


4
投票

F# 直接支持 OCaml 语法。它可能不是 100% 兼容,但我认为它非常接近。

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

这是差异列表(不确定它是如何最新的)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html

© www.soinside.com 2019 - 2024. All rights reserved.