F#派生自OCaml,但缺少或添加了哪些主要项目?具体来说,我很好奇可用于学习OCaml的资源是否对想要学习F#的人有用.
这个问题已经回答了一段时间了,但我很惊讶大多数答案都说明了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 Developer Division永远不会在Visual Studio 2010中包含F#.
主要区别在于F#不支持:
函子
OCaml风格的对象
多态变体
camlp4/5预处理器或扩展点(ppx)
此外,F#对标记和可选参数具有不同的语法.
理论上,可以使用F#编译不使用这些功能的OCaml程序.学习OCaml是F#的完美合理的介绍(反之亦然,我想象).
完整的差异列表在这里(注意:archive.org替换死链接).
我总是把F#描述为OCaml的堂兄,因为OCaml有许多F#没有的功能,而且永远不可能获得.F#与以前的CAML语言关系更密切.特别是,F#对抽象的支持非常有限,并且根本不支持结构类型(如OCaml的对象和多态变体).
与某些响应者所写的内容相反,F#对标记("命名")和可选参数的支持(有限).
然而,这些都是高级功能,您当然可以开始使用有关OCaml的资源来掌握小规模OCaml风格函数编程背后的基本思想.您将发现的第一个主要差异是封装和抽象等大规模问题,这些问题在OCaml和F#中以完全不同的方式解决.如果你想学习如何在F#中做到这一点,唯一可用的文献是关于纯功能数据结构的这篇文章.
我还发现OCaml的精彩模块系统可以很容易地在类型(例如数据结构)上参数化代码,但是OOP替代方案不仅可以隐藏,而且几乎完全不用于.NET.此外,在尝试编写优雅参数化的数据结构时,我在F#编译器中遇到了许多错误,因为之前没有人尝试过这样做.F#stdlib确实包含一些不错的数据结构实现,但几乎没有重用,即它是一个cut'n'paste工作.
F#和OCaml是ML系列语言中的分类学类,其中包括其他奇怪动物的整个传递.F#比OCaml更新,它没有functor [模块 - >模块的功能]或行类型[对象类和多态变体].在它们之间,这两个简化可能使在.Net平台上开发的人更容易学习.遗憾的是,这两种语言功能在OCaml中非常强大,因此阅读OCaml文献以获得有关如何编写F#代码的见解可能会导致对后者的过早挫败,因为它可能是C#的优秀替代品,两者都可用.