F#源自OCaml,但是缺少或添加了哪些主要项目?具体来说,我对于可用于学习OCaml的资源是否也对想学习F#的人有用感到好奇。
F#源自OCaml,但是缺少或添加了哪些主要项目?具体来说,我对于可用于学习OCaml的资源是否也对想学习F#的人有用感到好奇。
Answers:
主要区别在于F#不支持:
此外,F#对于标记和可选参数具有不同的语法。
从理论上讲,可以使用F#编译不使用这些功能的OCaml程序。学习OCaml是对F#的完全合理的介绍(反之亦然,我想)。
差异的完整列表在此处(请注意:替换失效链接的archive.org)。
这个问题已经回答了一段时间,但令我惊讶的是,大多数答案都说F#中缺少OCaml功能-如果您想将现有的OCaml程序移植到F#中,这肯定是一件好事(这可能是大多数参考文章的动机)。但是,有许多功能使F#成为不同的语言(不仅仅是OCaml for .NET的受限版本!)这是F#中添加的几件事:
+
所有数字类型以及支持它的类型。而且,说实话,我认为值得一提的是Visual Studio IDE。这不是语言的一部分,但是它确实改善了用户体验(Visual Studio中的IntelliSense支持确实很棒!)
如果您看一下列表,则有很多因素在很大程度上促进了F#的普及,因此,它不仅仅是“没有函子的OCaml”。F#绝对基于OCaml(并吸收了其他语言(例如Haskell)的想法)并与它们共享许多方面,但是还有很多其他事情。我猜想,如果没有异步工作流,.NET样式OO和元编程等内容,Microsoft开发人员部门将永远不会在Visual Studio 2010中包含F#。
<@ a @>
,更不用说类型定义了,<@ type t = int @>
并且它无法像Camlp4一样处理任意语法,其可扩展的词法分析器和解析器要少得多。缺少像样的宏系统是一个不足,但是恕我直言,缺少F#的像样的词法分析器和解析器是一个更为严重的障碍。我实际上建议开发人员使用OCaml创建他们的词法分析器和解析器,将自己限制为F#支持的子集,然后将其移植回F#,以便从OCaml的出色工具支持中受益!
我总是将F#描述为OCaml的表亲,因为OCaml具有F#所不具备且永远不可能获得的许多功能。F#与以前的CAML语言紧密相关。特别是,F#对抽象的支持非常有限,而对结构化类型(如OCaml的对象和多态变体)完全不支持。
与某些响应者所写的相反,F#确实(有限)支持标签(“命名”)和可选参数。
但是,这些都是高级功能,您当然可以开始使用OCaml相关资源来掌握小规模OCaml样式功能编程背后的基本思想。您将发现的第一个主要区别是更大的问题,例如封装和抽象,这些问题在OCaml和F#中以完全不同的方式解决。如果您想学习如何在F#中做到这一点,唯一的可用文献是有关纯函数数据结构的本文。
我还发现,OCaml出色的模块系统使通过类型(例如数据结构)对代码进行参数化变得容易,但是OOP替代品不仅令人讨厌,而且在.NET上几乎完全没有使用。此外,在尝试编写参数化的数据结构时,我在F#编译器中遇到了数十个错误,因为以前没有人尝试这样做。F#stdlib确实包含一些不错的数据结构实现,但实际上没有重用,即,这是一个“粘贴”工作。
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