【问题标题】:Is there any link between functional programming and strong typing?函数式编程和强类型之间有什么联系吗?
【发布时间】:2012-06-26 02:31:11
【问题描述】:

所有“纯”函数式语言都是强类型的。它们之间有联系吗?

【问题讨论】:

  • 函数式程序员的肌肉发达的手指,而不是命令式和动态程序员的那些软弱的手指:)
  • 你必须定义“纯”。
  • 所以你现在有了一个纯函数式动态编程语言:code.google.com/p/pure-lang
  • @pyfunc:“尽管有它的名字,PURE 并不是一种纯函数式语言,因为它允许用户更改变量的值。” ——PurePrimer1。在我看来,打印/C 绑定也是不纯的。我认为纯函数式语言倾向于具有类型系统的原因是您需要一些静态禁止诸如任意打印之类的事情的机制;如果您没有静态检查,那么您要么不具备纯粹的功能,要么根本无法打印。
  • 强类型语言与弱类型语言、静态类型语言与动态类型语言之间存在差异。这两个特征是正交的。我不确定您是否真的是指强类型 en.wikipedia.org/wiki/Type_system 我认为纯语言没有理由被限制在任何特定的组合中......纯洁只是另一个维度。

标签: programming-languages functional-programming strong-typing duck-typing


【解决方案1】:

非平凡的函数式编程技术大量使用一阶和高阶函数。一流的函数被实现为闭包。只有在进行垃圾收集时,才可以正常使用一流的函数和闭包。高效可靠的垃圾收集需要内存安全(我假设您的意思是“强类型”)。就这样吧。

纯度并不重要。

【讨论】:

    【解决方案2】:

    “纯”函数式语言是那些强制引用透明性的语言。强制执行可以是静态的(通过类型系统),也可以是动态的(例如运行时故障)。当您说“强类型”时,我猜您的意思是“静态类型”...

    Sincbe 社区中出现了类型化的纯函数式编程,它们在减少运行时故障和使编程更安全、增加纯度而无需类型强制(因此运行时故障仍然是一种选择)方面是单独发布的,这是不协调的。

    因此,您会看到类型和效果类型与默认情况下的纯度结合在一起并不奇怪:这一切都是为了减少运行时故障。

    【讨论】:

      【解决方案3】:

      Mercury(您可以在其中进行函数式编程,但它更像是一种纯逻辑编程语言)实际上有一个明确的静态纯度系统。每个谓词或函数都静态地被认为是纯的或不纯的(或半纯的,但我不打算详细讨论)。在纯函数中调用不纯函数(纯函数是默认值)将导致在编译时检测到错误。

      它还有一个静态类型系统,其中每个表达式/变量的类型都是编译器静态知道的,并且在编译时会检测到类型错误。但是类型系统完全独立于纯度系统(因为您可以拥有任何给定类型的纯、不纯和半纯函数)。

      因此,我们可以想象一种具有相同静态纯度系统的不同语言,但其中表达式/变量的类型不是静态已知的,并且可能在运行时动态变化。人们甚至可以想象这样一种语言在 PHP 的意义上具有“弱类型”(即,该语言将尝试转换值,以便实际上可以执行对值的类型没有意义的操作),或者在某种意义上C(即您可以说服该语言将一种类型的值存储在该语言将视为另一种类型的变量中)。

      人们也可以想象一种语言,其中的纯度不是静态已知的,而是在运行时仍然强制执行的。该语言必须做一些事情,例如跟踪它是否在纯调用中,如果是,则拒绝对不纯原始操作的调用。

      所以从这个意义上说,强类型和纯编程之间没有联系。

      然而,实际上强制纯粹性的语言(而不是像 Scala 那样仅仅鼓励它)传统上是通过静态分析来实现这一点的。确实,纯代码的动机之一是它比以任意方式不纯的代码更容易受到静态分析的影响。一个人为的例子是,如果一个函数接受一个布尔参数并返回一些东西,那么可以知道它最多返回两个结果之一,如果它是纯的。如果它不知道是纯的,那么语言必须假设它可能在每次调用时返回不同的东西。如果你有兴趣对你的代码进行静态分析并且你有这个静态执行纯度的分析系统,您不妨让它也执行类型安全。因此,对于强制执行纯度但没有强大的静态类型系统的语言来说,“没有那么多要求”。我不知道实际存在的任何语言(据我所知,根本没有那么多语言强制执行纯洁性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多