是否会有一种函数式语言为 Java 社区做 F# 为 .NET 社区做的事情?
JVM 有哪些函数式编程语言可用或正在开发中?
Scala将是语言。
虽然不是严格意义上的函数式(它是函数式和面向对象的混合体),也不是严格意义上的 Java(有Scala 的 .NET 版本),但这将是 JVM 中最接近 F# 的模拟。
我首先想到的是Scala,但实际上Ocaml-Java更接近于 F# 是 Ocaml 的变体。请参阅这篇将 Ocaml-Java 与 Scala 进行比较的帖子:
对于广泛的实际任务,OCaml 程序员的生产力通常是 Java 或 C++ 程序员的 10 倍以上。尽管基于基本的 OOP 平台,F# 在获取 OCaml(以及整个 ML 系列)的生产力提升优势方面还有很长的路要走。相比之下,Scala 未能捕捉到许多好处,包括一些非常基本的好处,因此,在 Scala 中编写正确的代码比在任何真正的 ML 中都要困难得多。
此外,ML 系列语言被设计为简洁,但 Scala 对“Hello world!”中的所有内容都不必要地冗长。向上。ML 系列语言提供了广泛的类型推断(OCaml 比大多数语言都多),但相比之下,Scala 仅提供基本的推断。OCaml 有一个异常丰富的类型系统,但 Scala 对 OOP 几乎没有什么实际意义。
也许是Clojure。它不是静态类型的,但它比 F# 更强调不变性和并发性。但是,与 F# 一样(与 Common Lisp 不同),它旨在成为一种主要的函数式语言,擅长从底层平台使用 OO 库。
现在我会说Scala。但对于未来,我会看看 Fortress。该规范的第一个实现于 2008 年 4 月 1 日发布。不,这不是玩笑。主要特点是:
可以说没有,因为 JVM 缺少尾调用,并且要求它们使几乎所有功能代码在堆栈消耗方面都健壮。
最接近 JVM 上的函数式语言实现的是Clojure、Scala和OCaml-Java项目。尽管没有尾调用(例如蹦床)有一些变通方法,但这些语言实现都没有这样做,因为变通方法引入了更严重的问题,例如削弱性能和完全混淆调试。
Sun 多年来一直在谈论尾部呼叫,最近,他们表示他们打算立即实施它们。一旦完成,我相信我们会在 JVM 上看到更多的语言多样性,特别是一些生产质量的函数式语言实现。在那之前,我将所有这些语言都视为玩具。
干杯,乔恩·哈罗普。
有一个很好的 JVM 编程语言列表,包括函数式编程范式和其他范式语言:
我的第一个选择是 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 - 函数式语言越来越多地用于企业级金融系统的内部。我们在我工作的银行使用许多功能性(纯或“半纯”)......
同时,还有Frege,一种纯函数式、非严格的 Haskell 精神语言,可编译为 Java,然后根据环境(命令行或 eclipse)使用 javac 或 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# 的使用——但是(纯粹是主观的)我根本不认为会有巨大的迁移。
我会将https://eta-lang.org添加到建议中——它基本上是 JVM 的 Haskell。我认为这个问题符合 F# 是一种 ML 语言,而 Clojure 是 LISP 的方言这一事实。