让我们
<
表示Haskell中的语义近似顺序。然后评估的单调性保证了如果
e1 < e2
那么[[e1]] < [[e2]]
,哪里e1
,e2
是表达式并[[e1]]
表示对的评估e1
。
在我关注的注释中,这被认为是推理Haskell程序的一个非常有用的属性,但是没有给出示例。
有人可以举一个这样的例子吗?
因为undefined <= 4
我们可以通过单调性得出结论undefined + 12 <= 4 + 12
。确实,前者是undefined
,而后者是16
。我们也有[undefined] <= [4]
,或更一般地说f undefined <= f 4
。
直觉是这样的:假设f :: Int -> T
。当f x
被调用时,要么f
要求整数参数,要么不要求整数参数x
。如果是这样,f undefined
它将是不确定的(崩溃/异常/不终止),因此f 4
肯定会比>=
。如果它不要求x
,那么f undefined = f 4 = f x
对于任何x
,<=
再一次保持不变。
事情变得越来越复杂,类型也越来越复杂。如果g :: (Int,Int) -> T
我们有
g undefined
<= g (undefined, undefined)
<= g (undefined, 2)
<= g (3, 2)
单调性背后的一个非常粗糙的想法是:如果我们给一个函数传递一个更定义的参数,我们将得到一个更定义(或相等定义)的结果。或更直率地说:更少的崩溃输入,更少的崩溃输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句