所有“纯”函数式语言都是强类型的。这些之间有什么联系吗?
3 回答
非平凡的函数式编程技术大量使用一阶和高阶函数。一流的函数被实现为闭包。只有当您进行垃圾收集时,才能正常使用一流的函数和闭包。高效可靠的垃圾收集需要内存安全(我假设您的意思是“强类型”)。所以你去。
纯度对此并不重要。
“纯”函数式语言是那些强制引用透明性的语言。强制执行可以是静态的(通过类型系统),也可以是动态的(例如运行时故障)。当你说“强类型”时,我猜你的意思是“静态类型”......
Sincbe 社区中出现了类型化的纯函数式编程,它们分别在减少运行时故障和使编程更安全、增加纯度而无需类型强制——这样运行时故障仍然是一种选择——是不协调的。
因此,您会看到类型和效果类型与默认情况下的纯度一起使用并不奇怪:这一切都是为了减少运行时故障。
Mercury(您可以在其中进行函数式编程,但更像是一种纯逻辑编程语言)实际上具有明确的静态纯度系统。每个谓词或函数都静态地被认为是纯的或不纯的(或半纯的,但我不打算详细讨论)。在纯函数中调用不纯函数(纯函数是默认值)将导致在编译时检测到错误。
它还有一个静态类型系统,其中每个表达式/变量的类型都是编译器静态知道的,并且在编译时检测到类型错误。但是类型系统完全独立于纯度系统(因为您可以拥有任何给定类型的纯、不纯和半纯函数)。
因此,我们可以想象一种具有相同静态纯度系统的不同语言,但其中表达式/变量的类型不是静态已知的,并且可能在运行时动态变化。甚至可以想象这样一种语言在 PHP 的意义上具有“弱类型”(即,该语言将尝试转换值,以便可以实际执行对值的类型没有意义的操作),或者在某种意义上C(即您可以说服语言将一种类型的值存储在该语言将视为不同类型的变量中)。
人们还可以想象一种语言,其中纯度不是静态已知的,但仍然在运行时强制执行。该语言必须做一些事情,例如跟踪它是否在纯调用中,如果是,则拒绝对不纯原始操作的调用。
所以从这个意义上说,强类型和纯编程之间没有联系。
然而,实际上强制纯粹性的语言(而不是像 Scala 中那样仅仅鼓励它)传统上通过静态分析来实现这一点。确实,纯代码的动机之一是它比以任意方式不纯的代码更容易受到静态分析的影响。一个人为的例子是,如果一个函数接受一个布尔参数并返回一些东西,那么可以知道它最多返回两个结果之一,如果它是纯的。如果不知道要变得纯粹,那么语言必须假设它可能在每次调用时返回不同的东西。如果你有兴趣对你的代码进行静态分析,并且你有这个用于强制纯度的静态分析系统,你不妨让它也强制执行类型安全。因此,对于强制执行纯度但没有强大的静态类型系统的语言来说,“没有那么多要求”。我不知道实际存在的任何语言(据我所知,根本没有那么多语言可以强制执行纯洁性)。