繁体   English   中英

函数式编程和强类型化之间是否有任何联系?

[英]Is there any link between functional programming and strong typing?

所有“纯”功能语言都是强类型。 两者之间有联系吗?

非平凡的函数式编程技术大量使用了一流的和高阶的函数。 一流的功能实现为闭包。 仅当您进行垃圾回收时,才可轻松使用一流的函数和闭包。 高效可靠的垃圾回收需要内存安全性(我认为您的意思是“强类型”)。 所以你去了。

纯度并不重要。

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

在减少运行时故障并在不进行类型强制的情况下使编程更安全地增加纯净度(例如,运行时故障仍然是一种选择)的情况下,分别发出发布有类型的纯函数式编程的社区是矛盾的。

因此,您不会意外地看到类型和效果类型与默认纯度一起使用:这全都在于减少运行时故障。

Mercury(您可以在其中进行函数式编程,但更像是一种纯逻辑编程语言)实际上具有显式的静态纯度系统。 每个谓词或函数在静态上都是纯净的或不纯净的(或半纯净的,但我将不做详细介绍)。 在纯函数(默认是纯函数)中放置对不纯函数的调用将导致在编译时检测到错误。

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

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

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

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

但是,实际上强制执行纯净的语言(而不是像Scala那样仅鼓励纯净)传统上是通过静态分析实现的。 确实,纯代码的动机之一是它比以任意方式不纯的代码更容易受到静态分析的影响。 一个人为的例子是,如果一个函数采用布尔型参数并返回某些值,则该函数可以返回最多两个结果之一(如果它是纯函数)。 如果不知道它是纯净的,则该语言必须假定它在每次调用时可能返回不同的结果。如果您对代码进行静态分析感兴趣,并且拥有用于执行纯净度的静态分析系统,则您可以也可能使其强制执行类型安全。 因此,对于那些要求纯净但没有强大的静态类型系统的语言而言,“呼吁并不多”。 我不知道实际上有什么存在(据我所知,并没有那么多的语言可以完全实现纯洁)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM