是否有一种函数式语言可以为Java社区提供F#为.NET社区所做的工作?

时间:2008-10-04 05:39:20

标签: functional-programming jvm

是否有一种函数式语言可以为Java社区提供F#为.NET社区所做的工作?

JVM可用或正在开发哪些函数式编程语言?

10 个答案:

答案 0 :(得分:43)

Scala将成为该语言。

虽然没有严格的功能(它是功能和面向对象的混合),但它并不严格用于Java(有一个.NET version of Scala),这将是JVM中与F#最接近的模拟。

答案 1 :(得分:20)

我想到的第一件事是 Scala ,但实际上 Ocaml-Java 更接近,因为F#是Ocaml的变体。见this post that compares Ocaml-Java to Scala

  

OCaml程序员的工作效率通常是Java或C ++的10倍   程序员可以完成各种实际任务。尽管是基于   从根本上说是OOP平台,F#在很大程度上抓住了生产力 -   提升OCaml(以及整个ML系列)的好处。相比之下,斯卡拉   未能获得许多好处,包括一些非常基本的好处,   因此,在Scala中编写正确的代码要比在   任何真正的ML。

     

此外,ML系列语言的设计简洁,但Scala是   来自“Hello world!”的所有内容都不必要地冗长!向上。 ML家族   语言提供了广泛的类型推断(OCaml比大多数),但   相比之下,Scala只有初步的推论。 OCaml有一个不寻常的   富有表现力的类型系统,但Scala对实际的OOP几乎没有什么作用   重要性。

答案 2 :(得分:18)

也许是Clojure。它不是静态类型的,但它比F#更强调不变性和并发性。但是,就像F#(和Common Lisp不同)一样,它本来是一种主要功能性语言,擅长从底层平台消费OO库。

答案 3 :(得分:3)

现在我想说Scala。但是对于未来,我会看看Fortress。该规范的第一个实现于2008年4月1日发布。不,这不是一个笑话。关键的特点是:

  • 静态类型,但很多类型推断以避免混乱
  • Unicode和2d数学函数的渲染
  • 专为并行执行而设计(针对每个默认值)
  • 对自定义库的强烈支持(Guy Steele的影响力)
  • 运算符重载,包括并置运算符

Project Fortress Community websiteWikipedia Fortress page的更多信息。

答案 4 :(得分:2)

可以说没有,因为JVM缺少尾调用,并且它们需要使几乎所有功能代码在堆栈消耗方面都很健壮。

JVM上最接近函数式语言实现的是ClojureScalaOCaml-Java项目。虽然缺少尾调用(例如蹦床)有变通方法,但这些语言实现都没有这样做,因为变通方法引入了更严重的问题,例如:严重破坏性能并完全混淆调试。

Sun多年来一直在谈论尾部呼叫,最近,他们表示他们打算立即实施它们。一旦完成,我相信我们将在JVM上看到更多的语言多样性,特别是一些生产质量的功能语言实现。在那之前,我认为所有这些语言都是玩具。

干杯, Jon Harrop。

答案 5 :(得分:2)

有一个很好的JVM编程语言列表,包括函数式编程范例和其他范例语言:

  • en.wikipedia.org/wiki/List_of_JVM_languages

我的第一个选择是Scala(多范式; OO& FP),我在2009年花了5个多月的时间研究Scala,并创建了一个快速参考表:bchiprog.blogspot.com/2009/05/scala-cheat -sheet.html

我注意到还有其他有趣的编程范例,其他关注并行处理,如X10,Fortress和Chapel。 X10在Scala上实现 - http://www.scala-lang.org/sites/default/files/odersky/scalaliftoff2009.pdf

它真正基于您需要解决的问题,然后选择最能解决问题的语言。我认为开发人员希望有一种语言能够轻松解决任何类型的问题,并且可以简单地完成。

答案 6 :(得分:1)

@Marc Gravell - 功能语言越来越多地用于企业级金融系统的内部。我们在我工作的银行使用了许多功能(纯粹或“半纯粹”)......

答案 7 :(得分:1)

同时,有Frege,一种纯粹的功能性,非严格的语言,在Haskell的精神中编译为Java,然后根据环境进一步使用javac或eclipse编译器进行编译(命令 - 线或日食。)

答案 8 :(得分:0)

实际上,我可能错了,但我不认为F#会像其他.NET语言一样主流;在一些圈子(学术,编译器,其他一些场景)中有用 - 但是,不要忘记 C#提供FP使用 - 并且每次都会变得更好:C#1.2有代表; C#2.0有匿名方法和捕获/关闭;为简单起见,C#3.0有lambda,而抽象的Expression有。匿名类型(C#3.0)与元组共享一些相似性(在方便性方面),但显然是非常不同的野兽,所以绝对不是类似的比较。

可能没有像F#那样优化,但对于大多数日常FP用例来说,绰绰有余。

很明显,对于不可变性(特别是线程化)的更好支持在很大程度上取决于C#语言团队的思想,以供将来考虑。

我的资金在于C#在FP上变得越来越好,并且是日常用途的.NET FP产品。当然,会有一些F#用法 - 但(纯粹是主观的)我根本看不到有大量的迁移。

答案 9 :(得分:0)

我会在建议中添加https://eta-lang.org-从根本上来说,它是JVM的Haskell。我认为这个问题与F#是ML语言而Clojure是LISP的方言这一事实​​相符。