【发布时间】:2019-09-15 09:25:26
【问题描述】:
是否可以编写一份合同来检查一个陈述是否正确? 比如我要定义一个合约
true :: Contract a
使得对于所有值 x,等式
assert true x == x
持有。
我尝试过这样的事情:
true :: Contract a
true = Pred (\a -> True)
但是当运行assert true x == x 编译器说x 是未定义的。
运行assert true 5==6 时,结果是False,我希望得到Contract violation error。
我应该如何更改这个true 合同?非常感谢您的帮助。
这里
data Contract :: * -> * where
Pred :: (a -> Bool) -> Contract a
Fun :: Contract a -> Contract b -> Contract (a -> b)
Assert 违反合约会导致运行时失败,否则返回原始结果:
assert :: Contract a -> a -> a
assert (Pred p) x = if p x then x else error "contract violation"
assert (Fun pre post) f = assert post . f . assert pre
【问题讨论】:
-
我假设这是使用库。你能指定你使用的是哪个库吗?
-
@bradrn 我没有。我自己定义了合同类型和断言函数
-
那你能给我们提供定义吗?除非我们知道您在使用什么,否则我们无法帮助您。
-
@bradrn 我做到了。在“这里”这个词之后,在问题的结尾。 (我编辑了问题)
-
旁注:Haskell 有很多表达式,但语句不多(报告将
import和do中的条目描述为语句)。