【问题标题】:Are there any statically-typed functional languages?有没有静态类型的函数式语言?
【发布时间】:2011-12-30 03:29:41
【问题描述】:

我来自静态类型背景并研究函数式编程,但我对动态类型并不完全感兴趣。我很好奇那里有什么样的选择。

一个开始的答案:ActionScript 3 是静态类型的,并提供了一些功能范式,尽管 AS3 程序不经常使用它们。

【问题讨论】:

  • 大多数“现代函数式语言”都是静态类型的,具有高效的类型推断。

标签: types programming-languages functional-programming static-typing


【解决方案1】:

我对像你这样的人(可能具有静态类型、OO、命令式背景)的最高建议是Scala。 Scala 是一种命令式功能混合体,对 OO 的支持比 Java 和大多数其他语言更好。 Scala 编译为 JVM 字节码(也支持 .net,但使用较少),并提供非 Java JVM 语言无法比拟的 Java 互操作性。我在my compiler - jgo 中使用 Scala,发现编写 Scala 代码非常有趣和令人满意。学习 Scala 的最佳资源是 Programming in Scala,由语言设计师本人编写。

如果您不想要混合语言,而是更愿意直接加入 FP 的竞争,我会选择 Haskell。 Haskell 是一种纯函数式语言;没有可变性或效果的(一流)概念。我最喜欢的 Haskell 资源是诙谐的 Learn You a Haskell for Great Good!。事实上,无论您是否打算使用 Haskell,我都强烈建议您阅读一些 LYAH,因为它是对静态类型 FP 世界的精彩介绍。我什至在考虑语言选择之前就开始阅读它。

【讨论】:

    【解决方案2】:

    一些具有一流词法闭包和保证尾调用消除的静态类型语言:

    没有尾调用消除:

    • C#(1999 年至今)
    • Scala(2008 年至今)

    【讨论】:

    • @ericsoco:我不这么认为。这些只是我可以在互联网上快速找到的语言的最后更新。
    • @jon_harrop 为什么你在回答中特别提到消除尾声?
    • @ericsoco:我个人不认为没有保证 TCO 的语言是函数式语言,因为它们无法稳健高效地表达基本的函数式惯用语,如延续传递风格。但是,很多人认为 Scala 和 C# 是函数式语言,所以我不想完全排除它们。
    • 我相信是的。
    • Scala 有尾调用优化。
    【解决方案3】:

    有很多。想到 Haskell、OCaml 和 F#。如果您是 Windows 开发人员,F# 非常好,并且受到 Microsoft 的大力支持(以及非常强大的 StackOverflow 社区)。 Lisp 家族语言(Common Lisp、Scheme、Clojure)是动态函数式语言的例子。

    ActionScript 3 具有可选的静态类型。另一方面,Haskell、OCaml 和 F# 编译器使用类型推断来确定性地推断类型。当您第一次查看用 OCaml 编写的代码时,由于缺少显式类型,因此具有动态类型语言的整洁外观和静态类型的类型安全性。我认为动态语言的可选静态类型(一个好主意)最终将被类型推断取代,并且 10 年后静态与动态的争论将毫无意义。

    【讨论】:

    • 这条评论陈旧得特别好。
    • F# 现在在 Linux 和 Mac 上得到正式支持。
    【解决方案4】:

    早在任何命令式语言之前,类型理论就首次应用于函数式编程(类型化 lambda 演算)。

    对于最先进的静态类型系统(在命令式世界中找不到任何可比的),请查看 CoqAgda

    【讨论】:

    • 实际上,类型理论来自相同的数学传统,它为我们提供了 lambda 演算和图灵机,并且早于编程语言。
    • @ibid,当然——我只是不会将函数式编程与 lambda 演算(以及组合逻辑等)分开,因此函数式编程本身早于计算。
    • 嗯,类型理论实际上也早于 lambda 演算。我知道的最早的例子是罗素和怀特黑德的数学原理(1910-1913)的类型论;简单类型理论是类型化 lambda 演算的先驱,可以追溯到 1920 年代。请参阅Wikipedia entry
    【解决方案5】:

    如果您熟悉 Java 生态系统,那么类似于 Haskell 的语言 Frege 可能值得一看,因为它可以编译为 Java 源代码。

    【讨论】:

    • 截至 2021 年 2 月,由于其 Github 项目缺乏活动,Frege 看起来已经死了。
    【解决方案6】:

    haskell 突然想到(尽管它的类型系统可能是目前最先进的),ML 语言家族,F# AFAIK。

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2018-01-24
      • 2016-09-26
      • 1970-01-01
      • 2011-08-17
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多