F#更改为OCaml [关闭]


126

F#源自OCaml,但是缺少或添加了哪些主要项目?具体来说,我对于可用于学习OCaml的资源是否也对想学习F#的人有用感到好奇。


3
从OCaml开发人员的角度来看,这是另一个比较,因此尽管有偏见但仍然很有用。
Mauricio Scheffer

8
注意:如果您对这个问题的命运感兴趣,请加入有关Meta Stack Overflow的讨论或在聊天中讨论-这里的评论非常无效,因此我将其删除。
Shog12年

1
@MauricioScheffer链接断开!
JD 2012年

2
@JonHarrop我认为此链接可能是更新的。(中田敬子子)
巴特

Answers:


89

主要区别在于F#不支持:

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

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

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

差异的完整列表在此处(请注意:替换失效链接的archive.org)。


3
是否有F#的camlp4等效项?
nlucaroni

不要这样 但是,您可以将程序通过camlp4传递到F#编译器中。(不推荐)
克里斯·康威

6
F#确实具有命名和可选参数,但是它使用了不同的语法和语义。在F#上使用Camlp4会遇到麻烦,因为F#几乎总是对缩进敏感,因此将需要一个新的词法分析器,而关于词法分析器的Camlp4文档已有近两年未编写。
JD

4
现在链接已死。我想那可能很好。我敢肯定F#自08年以来已得到改进。

1
我在某处听说微软不想在F#中添加类似于camlp4的功能,因为他们担心这种功能可能会鼓励人们开始使用Microsoft Visual Studio以外的开发环境。
chrismamo1 2015年

118

这个问题已经回答了一段时间,但令我惊讶的是,大多数答案都说F#中缺少OCaml功能-如果您想将现有的OCaml程序移植到F#中,这肯定是一件好事(这可能是大多数参考文章的动机)。但是,有许多功能使F#成为不同的语言(不仅仅是OCaml for .NET的受限版本!)这是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#。


18
哇!OCaml是专门为元编程而生的,在这种情况下,它远远优于F#和.NET。Camlp4是比F#更强大的报价系统。OCaml的词法分析器和解析器比.NET可用的任何方法都要好。同样,可以使用Camlp4宏来实现活动模式和计算表达式。OCaml还具有IDE,这些IDE提供的功能与Visual Studio针对F#的功能相同。
京东

4
尽管F#报价的目标与Camlp4中提供的报价完全不同(此外,这不是OCaml语言-它是基于它的系统),所以比较它们并不公平。Camlp4的存在当然是OCaml的优势,但与报价无关(它允许WebSharper,在GPU上运行F#等操作)
Tomas Petricek 2010年

12
@Tomas:当Camlp4在二进制级别与OCaml集成并且可以在运行的OCaml REPL中即时定义和使用Camlp4宏时,您如何调和有关Camlp4“是OCaml之上的系统”的说法?您如何将Camlp4提供“报价机制”这一事实与Camlp4“与报价无关”的说法相协调?当SkyDeck的ocamljs工具自2007年以来将使用Camlp4引用的OCaml代码编译为Javascript时,您如何调和Camlp4无法促进Websharper之类的暗示?
JD

6
@Tomas:F#甚至无法引用具有未绑定变量的表达式,例如<@ a @>,更不用说类型定义了,<@ type t = int @>并且它无法像Camlp4一样处理任意语法,其可扩展的词法分析器和解析器要少得多。缺少像样的宏系统是一个不足,但是恕我直言,缺少F#的像样的词法分析器和解析器是一个更为严重的障碍。我实际上建议开发人员使用OCaml创建他们的词法分析器和解析器,将自己限制为F#支持的子集,然后将其移植回F#,以便从OCaml的出色工具支持中受益!
JD

8
@Erik:“大多数人专注于F#缺少的内容,但我也想看看OCaml缺少的内容”。请注意,在将活动模式,元编程,计算表达式和异步工作流程纳入F#之前,它们已在OCaml中提供。
JD

16

我总是将F#描述为OCaml的表亲,因为OCaml具有F#所不具备且永远不可能获得的许多功能。F#与以前的CAML语言紧密相关。特别是,F#对抽象的支持非常有限,而对结构化类型(如OCaml的对象多态变体)完全不支持。

与某些响应者所写的相反,F#确实(有限)支持标签(“命名”)和可选参数。

但是,这些都是高级功能,您当然可以开始使用OCaml相关资源来掌握小规模OCaml样式功能编程背后的基本思想。您将发现的第一个主要区别是更大的问题,例如封装和抽象,这些问题在OCaml和F#中以完全不同的方式解决。如果您想学习如何在F#中做到这一点,唯一的可用文献是有关纯函数数据结构的本文

我还发现,OCaml出色的模块系统使通过类型(例如数据结构)对代码进行参数化变得容易,但是OOP替代品不仅令人讨厌,而且在.NET上几乎完全没有使用。此外,在尝试编写参数化的数据结构时,我在F#编译器中遇到了数十个错误,因为以前没有人尝试这样做。F#stdlib确实包含一些不错的数据结构实现,但实际上没有重用,即,这是一个“粘贴”工作。


28
所有链接都需要付费订阅。

2
@他们似乎是乔恩·哈罗普(Jon Harrop)自己写的东西的无耻插件(他每次都被列为作者)
symbiont

@symbiont是的,我们知道它有点垃圾。如果您链接到一些免费的其他信息,那就更好了。但是没有链接,答案就很好,所以您就可以了。

如果您自己链接一些其他信息,@ Will会很好
symbiont

@symbiont当我说“你”时,我的意思是乔恩,而不是你。听起来很奇怪,请阅读。不知道乔恩是否删除了插页式注释。无论如何,您可以进行以下操作:元堆栈交换

9

F#和OCaml在ML语言家族中是分类上的类,其中也包括其他所有奇怪的动物。F#比OCaml更新,并且它既没有函子[模块的功能->模块],也没有行类型[对象类和多态变体]。在这两者之间,这两种简化可能会使在.Net平台上进行开发的人员更容易学习曲线。可悲的是,这两种语言功能在OCaml中都非常强大,因此阅读OCaml文献以获取有关如何为F#编码的见解时,可能会导致后者过早的挫败,因为后者可能是同时可用的C#的绝佳替代品。


2

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


1
“ F#直接支持OCaml语法。它可能不是100%兼容的,但我认为它非常接近”。IME F#编译器对OCaml兼容性的支持非常困难。由于F#编译器内部依赖有效代码,因此这可能会使将现有OCaml代码库移植到F#变得困难。
JD 2012年

所有链接均已消失。
Wingjam '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.