当前位置:  开发笔记 > 编程语言 > 正文

F#更改为OCaml

如何解决《F#更改为OCaml》经验,为你挑选了4个好方法。

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



1> Tomas Petric..:

这个问题已经回答了一段时间了,但我很惊讶大多数答案都说明了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#.


哇!OCaml专门用于元编程,在这种情况下它远远优于F#和.NET.Camlp4是一个比F#更强大的报价系统.OCaml的词法分析器和解析器比.NET的任何东西都好.此外,Camlp4宏可用于实现活动模式和计算表达式.OCaml还具有IDE,它们提供了Visual Studio为F#提供的相同优势.
@Tomas:当Camlp4在二进制级别与OCaml集成时,如何协调Camlp4"是OCaml之上的系统",并且可以在正在运行的OCaml REPL中动态定义和使用Camlp4宏,如何协调?你如何调整Camlp4"与引文无关"的主张与Camlp4提供报价机制的事实?当SkyDeck的ocamljs工具编译自2007年以来使用Camlp4到Javascript引用的OCaml代码时,你如何调和Camlp4无法促进Websharper之类的暗示呢?
谢谢!大多数人都关注F#中缺少的东西,但我也想看看OCaml缺少什么.
@Erik:"大多数人都关注F#中缺少的东西,但我也想看看OCaml缺少什么".请注意,活动模式,元编程,计算表达式和异步工作流在OCaml进入F#之前可用.
@Tomas:F#甚至不能引用带有未绑定变量的表达式,如`<@ a @>`,更不用说类型定义,如`<@ type t = int @>`,它不能处理任意语法,而不像Camlp4那样可扩展词法分析器和解析器.缺乏一个体面的宏观系统是一个缺点,但是,恕我直言,F#缺乏任何体面的词法分析器和解析器是一个更严重的障碍.我实际上建议开发人员使用OCaml创建他们的词法分析器和解析器,将自己限制为F#支持的子集并将其移植回F#,以便从OCaml的卓越工具支持中受益!
F#引用的目标与Camlp4中的可用目标完全不同(除此之外,这不是OCaml语言 - 它是一个基于它的系统),因此比较它们是不公平的.Camlp4的存在肯定是OCaml的优势,但它与引用无关(允许像WebSharper这样的东西,在GPU上运行F#等)
作为WebSharper开发人员,我同意Jon的观点.用于语法操作的OCAML语言和工具领先于F#,甚至考虑引用.
@RickMinerich:OCaml的全局锁定在2009年被OC4MC项目删除了,但结果几乎没有实际用途,因为它太慢而且规模很小.

2> Chris Conway..:

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

函子

OCaml风格的对象

多态变体

camlp4/5预处理器或扩展点(ppx)

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

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

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


F#确实有命名和可选参数,但它使用不同的语法和语义.你将无法在F#中使用Camlp4,因为F#几乎总是对缩进敏感,所以它需要一个新的词法分析器,并且lexers上的Camlp4文档在近两年内仍然是不成文的.
现在链接已经死了.我想这可能很好.我确信F#自08年以来一直在改进.
F#有一个等效的camlp4吗?

3> Jon Harrop..:

我总是把F#描述为OCaml的堂兄,因为OCaml有许多F#没有的功能,而且永远不可能获得.F#与以前的CAML语言关系更密切.特别是,F#对抽象的支持非常有限,并且根本不支持结构类型(如OCaml的对象和多态变体).

与某些响应者所写的内容相反,F#对标记("命名")和可选参数的支持(有限).

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

我还发现OCaml的精彩模块系统可以很容易地在类型(例如数据结构)上参数化代码,但是OOP替代方案不仅可以隐藏,而且几乎完全不用于.NET.此外,在尝试编写优雅参数化的数据结构时,我在F#编译器中遇到了许多错误,因为之前没有人尝试过这样做.F#stdlib确实包含一些不错的数据结构实现,但几乎没有重用,即它是一个cut'n'paste工作.


所有链接都需要付费订阅.
@他们似乎是乔恩·哈罗普(Jon Harrop)自己写的东西的一个无耻的插件(他每次都被列为作者)

4> james woodya..:

F#和OCaml是ML系列语言中的分类学类,其中包括其他奇怪动物的整个传递.F#比OCaml更新,它没有functor [模块 - >模块的功能]或行类型[对象类和多态变体].在它们之间,这两个简化可能使在.Net平台上开发的人更容易学习.遗憾的是,这两种语言功能在OCaml中非常强大,因此阅读OCaml文献以获得有关如何编写F#代码的见解可能会导致对后者的过早挫败,因为它可能是C#的优秀替代品,两者都可用.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有