是否会有一种函数式语言能够为 Java 社区提供像 F# 为 .NET 社区所做的那样?

StackOverflow https://stackoverflow.com/questions/169812

  •  05-07-2019
  •  | 
  •  

是否会有一种函数式语言能够为 Java 社区提供像 F# 为 .NET 社区所做的那样?

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

有帮助吗?

解决方案

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

其他提示

Scala 将成为该语言。

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

我想到的第一件事是 Scala ,但确实 Ocaml-Java 更接近,因为F#是Ocaml的变体。请参阅这篇将Ocaml-Java与Scala进行比较的帖子

  

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

     

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

现在我会说Scala。但对于未来,我会看看 Fortress。该规范的首次实施于 2008 年 4 月 1 日发布。不,这不是玩笑。主要特点是:

  • 静态类型,但需要进行大量类型推断以避免混乱
  • 数学函数的 Unicode 和二维渲染
  • 专为并行执行而设计(每个默认值都是如此)
  • 对自定义库的大力支持(Guy Steele 的影响)
  • 运算符重载,包括并置运算符

更多信息请访问 要塞计划社区网站维基百科要塞页面.

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

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

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

干杯, Jon Harrop。

有一个很好的 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

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

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

与此同时,弗雷格是一种纯粹的功能性,非严格的语言,本着编译为Java的Haskell,然后使用javac或eclipse编译器进一步编译,具体取决于环境(命令行或eclipse)。

实际上,我可能错了,但我不认为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#用法 - 但(纯粹是主观的)我根本看不到有大量的迁移。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top