告诉条件语句分支中的依赖函数条件为真
Tell dependent function in conditional statement branch that condition is true
我有一个类型签名为 (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"
但你不应该。
使用布尔值(通过 =
or So
)可以告诉你某件事是真的,但不是 为什么。 why 如果您想将证明组合在一起或将它们分开,则非常重要。想象一下,如果 add
调用了一个需要 x + y < 20
的函数——我们不能只通过证明 x + y < 10 = True
因为 Idris 对操作一无所知,只知道它是真的。
相反,您应该使用包含 为什么 的数据类型来编写上面的代码。 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"
现在,如果 add
调用了一个需要 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)
这不是我们仅用布尔值就能轻易做到的事情。
我有一个类型签名为 (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"
但你不应该。
使用布尔值(通过 =
or So
)可以告诉你某件事是真的,但不是 为什么。 why 如果您想将证明组合在一起或将它们分开,则非常重要。想象一下,如果 add
调用了一个需要 x + y < 20
的函数——我们不能只通过证明 x + y < 10 = True
因为 Idris 对操作一无所知,只知道它是真的。
相反,您应该使用包含 为什么 的数据类型来编写上面的代码。 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"
现在,如果 add
调用了一个需要 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)
这不是我们仅用布尔值就能轻易做到的事情。