F# 是从 OCaml 派生的,但缺少或增加了哪些主要项目?具体来说,我很好奇可用于学习 OCaml 的资源是否对想要学习 F# 的人也有用。
4 回答
这个问题已经回答了一段时间了,但我很惊讶大多数答案都说 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#。
主要区别在于 F# 不支持:
- 函子
- OCaml 风格的对象
- 多态变体
- camplp4/5 预处理器或扩展点 (ppx)
此外,F# 对标记参数和可选参数有不同的语法。
理论上,不使用这些功能的 OCaml 程序可以用 F# 编译。学习 OCaml 是对 F# 的一个非常合理的介绍(反之亦然,我想)。
完整的差异列表在这里(注意:archive.org 替换死链接)。
F# 和 OCaml 在分类学上属于 ML 语言家族,其中也包括许多其他奇怪的动物。F# 比 OCaml 更新,它还没有函子 [模块的函数 -> 模块] 或行类型 [对象类和多态变体]。在它们之间,这两个简化可能使在 .Net 平台上开发的人的学习曲线更容易。遗憾的是,这两种语言功能在 OCaml 中非常强大,因此阅读 OCaml 文献以深入了解如何为 F# 编码可能会导致对后者过早地感到沮丧,因为后者可能是两者都可用的 C# 的绝佳替代品。
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