我想我知道什么是参照透明和纯粹的意思。然而,这里有一个关于这两个属性以及它们有何不同的问题。
至于如何在语言中执行引用透明度和/或纯度,我不太了解。(即使这也不能帮助我理解。)我的意思是,我可能知道(某种程度)Haskell 是如何处理 IO 的,尽管它是纯函数式的(见这个),而且我知道我不能编写不纯的函数,因为类型系统只是不让我(或者,更好的是,它确实让我以一种受控的方式,因为我必须unsafe
明确地写出来)。
但是在 C++ 中,就像在许多其他语言中一样,函数通常不是纯的,也不是引用透明的。
所以一方面我有 Haskell,它被构造为一种纯语言,其中每个函数都是纯的。另一方面,我有 C++,它无法强制执行纯度(或者是吗?¹)。²
但是,在未来,C++ 语言是否有可能提供pure
一个可以附加到函数的 /whatever 属性,以便编译器必须验证该函数确实是纯的(否则编译时会失败)?
[[gnu:pure]]
(¹) 当我第一次知道and[[gnu:const]]
时,我的脑海中突然出现了这个问题。我的理解是,那些(不可移植的)属性是为了给编译器更多的保证,以便它可以优化更多的东西,而不是告诉它检查函数是否真的是纯的。毕竟这个例子似乎编译和运行得很好。
(²) 但我还记得另一种非常古老的语言,它不像 Haskell 那样纯,但给你一个PURE
属性来告诉你一个函数必须是纯的,编译器检查了它:Fortran。