让
<
表示Haskell中的语义近似顺序。然后评估的单调性保证如果
e1 < e2
那么[[e1]] < [[e2]]
,其中e1
,e2
是表达式,[[e1]]
表示对e1
的评估。
在我关注的笔记中,这被认为是推理Haskell程序的一个非常有用的属性,但是没有给出示例。
有人可以给我一个这种推理的例子吗?
答案 0 :(得分:4)
自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)
我们有
sys.columns
单调性背后的非常粗略的想法是:如果我们传递一个更定义的参数的函数,我们得到一个更明确(或同样定义)的结果。或者更直率地说:减少输入崩溃,减少输出崩溃。