F#和Scala之间的最大区别是什么?


59

F#和Scala都是功能性编程语言,它们并不强迫开发人员仅使用不可变的数据类型。它们都支持对象,可以使用以其他语言编写的库并在虚拟机上运行。两种语言似乎都基于ML。

尽管F#是为Java平台的.NET和Scala设计的,但F#和Scala之间的最大区别是什么?


2
如果您可以投票并认为这是一个有用的问题,或者在下面有有用的答案,请投票。StackExchange网站需要投票才能建立一个良好的社区。您每天可以投票30张,不要浪费它们。特别是那些享有较高声誉和低票数的用户,请阅读以下内容:meta.programmers.stackexchange.com/questions/393/…–
Maniero

functional programming langugages that don't force the developer to only use immutable datatypes-除了玩具语言以外,有没有?
Ingo

1
@Ingo,如果您认为ML和Ocaml因为允许可变性而没有资格作为函数式编程语言,也许您应该调整定义!
Frank Shearar

3
+弗兰克,您一定有一个误解:我的意思是,即使Haskell也具有可变的数据类型。因此,我仍然想知道@Jonas可能会记住哪些语言将迫使一种语言仅使用不可变的数据类型?
Ingo 2012年

Answers:


61

主要区别:

  • Scala和F#都将面向对象的命令式编程和功能性编程组合到一种语言中。但是,他们对范式统一的方法却大不相同。Scala尝试将两个范例融合为一个(我们称之为对象功能范例),而F#并排提供了两个范例。例如,F#中的代数数据类型是纯函数结构,其中没有OO',而Scala中的ADT仍然是常规类和对象。(注意:在编译为CLR字节码的过程中,即使F#ADT成为类和对象,但它们在源级别对F#程序员也不可见。)

  • F#具有完整的Hindley-Milner样式类型推断。Scala具有部分类型推断。对子类型化和纯正OO风格的支持使得Scala无法实现Hindley-Milner样式类型推断。

  • Scala比F#更简单。Scala具有非常小的正交结构集,可在整个语言中重复使用。F#似乎为每件事都引入了新的语法,因此与Scala相比,语法变得非常繁琐。(Scala有40个关键字,而F#有97个关键字。这应该可以告诉您一些信息。:-)

  • 作为Microsoft语言的F#以Visual Studio的形式提供了出色的IDE支持。Scala方面的情况不是很好。Eclipse插件仍未达到目标。NetBeans插件也是如此。目前,IDEA似乎是您最好的选择,尽管它甚至与您使用Java IDE所获得的收益并不接近。(对于Emacs爱好者,有ENSIME。我已经听说过有关此软件包的很多好处,但是我还没有尝试过。)

  • Scala具有比F#更强大(且更复杂)的类型系统。


其他差异:

  • F#函数默认为咖喱。在Scala中,可以使用currying,但并不经常使用。

  • Scala的语法是Java,Standard ML,Haskell,Erlang和许多其他语言的混合语法。F#语法受OCaml,C#和Haskell的启发。

  • Scala支持更高种类和类型类。F#没有。

  • Scala比F#更适合DSL。


PS:我爱Scala和F#,并希望它们将来成为各自平台的主要语言。:-)


6
这个答案使一些误解永久存在。我将依次列举每个。您说过“ F#中的代数数据类型是纯函数构造,其中没有OO'ness”,但是F#中的代数数据类型只是类,尤其是它们支持OO实例/静态成员和属性的扩充。
乔恩·哈罗普

7
您说“ Scala试图将两个范式融合为一个(我们称之为对象功能范式)”,但是Scala缺少通用的尾部调用消除功能,因此缺少任何非平凡的功能代码(包括几乎所有常规功能惯用法,例如延续传递)样式和解开递归结)在Scala中容易出现堆栈溢出,因此实际上是没有用的。
乔恩·哈罗普

4
@JonHarrop:Scala不会特别对待ADT。他们像普通班一样对待。Thereofre Some(2)在Scala有类型Some[Int],而不是Option[Int]这是不希望IMO。另一方面,F#对ADT具有特殊的语法和处理方式,因此可以正确地推断Some 2as的类型int option。因此,ADT的F#编码要好于Scala的(当然是IMO)。我没有试图暗示它是次等的,如果遇到这种情况,我感到抱歉。
missingfaktor 2011年

9
@JonHarrop:JVM中缺少TCO并没有困扰许多Scala开发人员。相信我,这并不像您认为的那么重要。大多数时候,我们使用的是高阶函数,而不是显式递归。Scala中的大多数高阶函数都是根据循环而不是递归实现的。因此,缺乏总拥有成本几乎变得无关紧要。
missingfaktor 2011年

8
我觉得整个答案有点偏向于Scala。例如,Scala是比F#更简约的语言,这似乎违背了他关于更复杂的类型系统的观点/观点。
亚当·根特

9
  • F#基于功能方面,而scala基于面向对象方面。
  • F#在Visual Studio中具有更好的IDE支持, Scala的eclipse插件用于开源IDE,并且速度相对较慢。
  • F#比Scala更像ML,与OCaml,Standard ML和Scheme相比,它具有更多的最小λ演算。F#似乎是一种相当简单的语言。

4
“ F#似乎是一种相当简单的语言。” <<不,不是。它比Scala大得多。我应该写一些关于这个主题的文章。
missingfaktor 2012年

4
“ Scala基于面向对象的方面。” <<错误。Scala试图融合OOP和功能编程。我个人很少使用其面向对象的功能。我们所做的大部分工作都是纯粹的功能。
missingfaktor 2012年

@missingfaktor:“它比Scala大得多”。语法有多大?
乔恩·哈罗普

1
我不知道情况是否有所改变。IntelliJ中的Scala仍然是开源的。
Colliot

0

许可证是一个小而重要的要点:Scala是BSD(几乎是目前最宽松的自由软件许可证),F#以前是“ Microsoft Research Shared Source许可协议”,但如今已是商业产品(根据下面的@Lorenzo,尽管我在任何地方都找不到更具体的许可协议)。


3
实际上,F#现在是开源的,而Scala现在是Martin Odersky公司Scala Solutions的商业产品。
乔恩·哈罗普

4
@Jon Harrop:我认为Scala Solutions只销售与Scala相关的工具,服务,培训等。该语言本身似乎仍在BSD许可之下。
Joonas Pulakka 2010年

2
@Joonas:确实,F#也是如此。
乔恩·哈罗普

5
@JonHarrop:Scala仍然是开源的。请不要散布错误信息。
missingfaktor 2012年

2
@missingfaktor:我不是说Scala是封闭源。
乔恩·哈罗普
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.