我有一个类型签名(x,y:SomeType)的功能 – > (cond x y)= True – > SOMETYPE.当我检查if-then-else / case / with语句中的条件时,如何传递给相应分支中的函数,该条件是真的?
您可以使用DecEq来做到这一点:
- add : (x,y : Nat) -> x + y < 10 = True -> Nat
- add x y _ = x + y
- main : IO ()
- main =
- let x = S Z
- in let y = Z
- in case decEq (x + y < 10) True of
- Yes prf => print (add x y prf)
- No _ => putStrLn "x + y is not less than 10"
但你不应该.
使用布尔(通过=
或So
)可以告诉你一些事情是真的,但不是为什么.如果你想组合证明或将它们分开来,为什么非常重要.想象一下,如果add称为需要x y < 20 - 我们不能仅仅通过我们的证据,即x y < 10 =真的,因为伊德里斯对这个操作一无所知,就是这样. 相反,您应该使用包含为什么它是真实的数据类型写上述. LTE
是一种类型,不到比较:
- add : (x,y : Nat) -> LTE (x + y) 10 -> Nat
- add x y _ = x + y
- main : IO ()
- main =
- let x = S Z
- in let y = Z
- in case isLTE (x + y) 10 of
- Yes prf => print (add x y prf)
- No _ => putStrLn "x + y is not less than 10"
现在,如果添加称为需要LTE(x y)20的函数,我们可以编写一个扩大约束的函数:
- widen : a `LTE` b -> (c : Nat) -> a `LTE` (b + c)
- widen LTEZero c = LTEZero
- widen (LTESucc x) c = LTESucc (widen x c)
这不是我们可以轻易地做的只是布尔值.