Programming languages 函数式编程和强类型之间有什么联系吗?

Programming languages 函数式编程和强类型之间有什么联系吗?,programming-languages,functional-programming,strong-typing,duck-typing,Programming Languages,Functional Programming,Strong Typing,Duck Typing,所有“纯”函数式语言都是强类型的。这两者之间有什么联系吗?非平凡函数编程技术大量使用一级函数和高阶函数。第一类函数作为闭包实现。只有在进行垃圾收集时,才可以不费力地使用一流函数和闭包。高效可靠的垃圾收集需要内存安全性(我想您指的是“强类型”)。好了 “纯粹”函数式语言是那些强制引用透明的语言。强制可以是静态的(通过类型系统),也可以是动态的(例如运行时故障)。我猜你说“强类型”是指“静态类型” 自那时起,类型化纯函数式编程诞生的社区在减少运行时故障和使编程更安全方面被单独发布,在没有类型强制的情

所有“纯”函数式语言都是强类型的。这两者之间有什么联系吗?

非平凡函数编程技术大量使用一级函数和高阶函数。第一类函数作为闭包实现。只有在进行垃圾收集时,才可以不费力地使用一流函数和闭包。高效可靠的垃圾收集需要内存安全性(我想您指的是“强类型”)。好了

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

自那时起,类型化纯函数式编程诞生的社区在减少运行时故障和使编程更安全方面被单独发布,在没有类型强制的情况下增加纯度——因此运行时故障仍然是一种选择——是不协调的

因此,在默认情况下,类型和效果类型与纯度一起使用也就不足为奇了:这都是为了减少运行时故障。

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

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

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

我们还可以想象一种语言,在这种语言中,纯度不是静态已知的,但在运行时仍然是强制的。这种语言必须做一些事情,例如跟踪它是否在纯调用中,如果是这样,则拒绝对不纯基元操作的调用

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


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

函数式程序员的有力手指,而不是命令式和动态式程序员的软弱手指:)您必须定义“pure”,因此您现在有了一种纯函数式动态编程语言:@pyfunc:“尽管它的名称不同,pure不是纯函数式语言,因为它允许用户更改变量的值。" — . 在我看来,打印/C绑定也是不加选择的。我认为纯函数式语言倾向于使用类型系统的原因是,您需要某种静态禁止任意打印的机制;如果您没有静态检查,那么您要么不是纯功能性的,要么根本无法打印。强类型语言与弱类型语言、静态类型语言与动态类型语言之间存在差异。这两个特征是正交的。我不确定你是否真的是指强类型,我看不出纯语言有任何理由被限制在任何特定的组合。。。纯洁只是另一个维度。