F#改为OCaml

F#是从OCaml派生的,但是哪些主要项目缺失或添加? 具体来说,我很好奇,可用于学习OCaml的资源是否对想要学习F#的人也有用。

主要的区别是F#不支持:

  • 函子
  • OCaml样式的对象
  • 多态变体
  • camlp4预处理器

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

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

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

这个问题已经被回答了一段时间了,但是我很惊讶,大部分的答案都说明了OCaml在F#中缺less的function – 如果你想将现有的OCaml程序移植到F#(这可能是大多数参考文章的动机)。 但是,有许多function使得F#成为一种不同的语言(不仅限于.NET的OCaml的有限版本!)以下是F#中添加的一些内容:

  • 测量单位允许您键入检查处理数字计算的代码
  • 使用引号进行元编程 (这使得在F#中使用LINQ成为可能,并且对于像WebSharper平台这样的promissing项目也是必不可less的)
  • 用于为function数据types创build抽象的活动模式 (对于更复杂的模式匹配应用程序通常非常有用)
  • 计算expression式asynchronous工作stream (一个用于asynchronousI / O / Web服务/ GUI编程的库)的语言特性,
  • .NET兼容的对象系统 ,使得与.NET平台完全互操作成为可能(OCaml也支持对象但不同 – 当然这两个系统都有一些好处)。
  • 重载操作符 – 据我所知,OCaml没有重载操作符 – 在F#中,可以使用+来表示所有的数字types以及支持它的types。

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

如果你看清楚这个列表,那么很多事情在很大程度上促成了F#的普及,所以它不仅仅是“没有函子的OCaml”。 F#肯定是基于OCaml的(并且从Haskell等其他语言中获得了一些想法),并且与他们共享许多方面,但是还有很多其他的东西。 我猜,如果没有asynchronous工作stream,.NET风格的OO和元编程之类的东西,微软开发者部门将永远不会在Visual Studio 2010中包含F#。

我总是将F#描述为OCaml的表亲,因为OCaml有很多F#没有的function,也永远不可能得到。 F#与以前的CAML语言关系更密切。 特别是,F#对抽象的支持非常有限,并且根本不支持结构types(如OCaml的对象和多态variables )。

与一些响应者所写的相反,F#对标记(“命名”)和可选参数具有(有限的)支持。

但是,这些都是高级function,您肯定可以开始掌握使用关于OCaml的资源的小型OCaml风格函数式编程背后的基本思想。 你会发现的第一个主要区别是在OCaml和F#中以完全不同的方式解决了封装和抽象等大规模问题。 如果你想学习如何在F#中做到这一点,唯一可用的文献是关于纯function数据结构的文章 。

我还发现,OCaml的精彩模块系统可以很容易地将代码参数化为types(比如数据结构),但是面向对象的select不仅在.NET上可怕,而且几乎完全没有使用。 而且,当试图编写优雅的参数化数据结构时,我碰到了F#编译器中的几十个错误,因为之前没有人试图这样做。 F#stdlib确实包含了一些很好的数据结构实现,但实际上没有重用,也就是说,它是一个“干净的”工作。

F#和OCaml在ML族语言中是分类学的类别,其中也包括其他怪异动物的整个密码。 F#比OCaml更新,它没有functor [模块 – >模块的function]或行types[对象类和多态variables]。 在他们之间,这两个简化可能使得在.Net平台上开发人员的学习曲线更容易。 不幸的是,这两种语言特性在OCaml中非常强大,因此阅读OCaml文献以获得有关如何编写F#的见解可能会导致对后者过早的挫败,因为它可能是C#的一个很好的替代scheme。

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