F#和Scala都是功能性编程语言,它们并不强迫开发人员仅使用不可变的数据类型。它们都支持对象,可以使用以其他语言编写的库并在虚拟机上运行。两种语言似乎都基于ML。
尽管F#是为Java平台的.NET和Scala设计的,但F#和Scala之间的最大区别是什么?
functional programming langugages that don't force the developer to only use immutable datatypes
-除了玩具语言以外,有没有?
F#和Scala都是功能性编程语言,它们并不强迫开发人员仅使用不可变的数据类型。它们都支持对象,可以使用以其他语言编写的库并在虚拟机上运行。两种语言似乎都基于ML。
尽管F#是为Java平台的.NET和Scala设计的,但F#和Scala之间的最大区别是什么?
functional programming langugages that don't force the developer to only use immutable datatypes
-除了玩具语言以外,有没有?
Answers:
主要区别:
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#,并希望它们将来成为各自平台的主要语言。:-)
Some(2)
在Scala有类型Some[Int]
,而不是Option[Int]
这是不希望IMO。另一方面,F#对ADT具有特殊的语法和处理方式,因此可以正确地推断Some 2
as的类型int option
。因此,ADT的F#编码要好于Scala的(当然是IMO)。我没有试图暗示它是次等的,如果遇到这种情况,我感到抱歉。
许可证是一个小而重要的要点:Scala是BSD(几乎是目前最宽松的自由软件许可证),F#以前是“ Microsoft Research Shared Source许可协议”,但如今已是商业产品(根据下面的@Lorenzo,尽管我在任何地方都找不到更具体的许可协议)。