Programming languages 什么是编程语言中的不变量?为什么它很重要?

Programming languages 什么是编程语言中的不变量?为什么它很重要?,programming-languages,invariants,Programming Languages,Invariants,有人能解释一下编程语言中的不变量是什么以及它们为什么重要吗?不变量是数据的一种属性,您希望它始终保持不变。不变量很重要,因为它们允许您将业务逻辑与验证分离。您的函数可以安全地假定它们没有接收到无效数据 例如,在国际象棋游戏中,一次只有一个棋子可以占据棋盘上给定的正方形。不变量可以在编译时强制执行,通常通过使用静态类型系统通过构造使对象正确,例如,将电路板表示为可选块的矩阵。它们也可以在运行时强制执行,例如,在尝试进行无效移动时引发异常 函数式编程语言中的方法通常是使对象不可变,并防止构造无效状态

有人能解释一下编程语言中的不变量是什么以及它们为什么重要吗?

不变量是数据的一种属性,您希望它始终保持不变。不变量很重要,因为它们允许您将业务逻辑与验证分离。您的函数可以安全地假定它们没有接收到无效数据

例如,在国际象棋游戏中,一次只有一个棋子可以占据棋盘上给定的正方形。不变量可以在编译时强制执行,通常通过使用静态类型系统通过构造使对象正确,例如,将电路板表示为可选块的矩阵。它们也可以在运行时强制执行,例如,在尝试进行无效移动时引发异常

函数式编程语言中的方法通常是使对象不可变,并防止构造无效状态。在OOP语言中,对象通常是可变的,因此需要使用方法来防止无效的状态转换

无论哪种方式,强制执行不变量都可以确保程序始终处于可预测状态,这使得您更容易对代码进行推理,并在不引入回归的情况下安全地进行更改。

什么是不变量 任何字段中的不变量-通常是数值,如果这些不变量不相同,则允许您区分对象

例如,如果你有一个数学术语

(x+3)²+1
你想变换一个不变量,用一个随机数代替x,我的rng选择了x=0,所以不变量是

(0+3)²+1 = 9+1 = 10
如果我把这个词变换得不正确

x²+6x+3 + 1 = x² + 6x +4
再次测试x=0时,我看到0²+0+4=4,这与10不同,因此我知道一定是错误的。 但另一方面,如果我把这个词改成

x²+3x+9 +1 = x²+3x+10
x=0的不变量又是10,我们看到了

为什么它们有用? 不同的不变量=>不同的对象 相同的不变量=>可能是相同的对象 例子:等式推理 为什么这在函数式编程中变得有趣?在本文中,你会听到一个表达式是等式推理,这意味着,如果你能在不失去等式的情况下将一个算法/函数/术语转换成另一个算法/函数/术语,这就是我上面所做的过程。对于像haskell这样的语言来说,这通常是正确的,因为存在不变性、无副作用等限制。而在oo中,这通常是不正确的。等式推理允许您缩小出现错误的区域,因此调试/错误查找相对更容易完成

示例:基于属性的测试 不变量常见的另一个领域是基于属性的测试:这里的标准示例为这种反向::[a]->[a],即链表上的反向函数具有反向属性。反转==id,即反转两次等于什么也不做。 如果您将其放在快速检查测试中-测试生成器生成任意列表并检查此属性-如果其中一个可能有数千个测试失败,您知道,在哪里可以改进代码

示例:编译器优化
某些属性还可用于优化代码,例如,如果用于所有函数fmap f。fmap g==fmap f。g和左手边遍历数据结构两次,其中右手边只遍历一次,编译器可以替换它们,使代码速度加倍。

国际象棋世界中另一个更有趣的例子是从白场开始的bishop永远不会在黑场,反之亦然