Error handling 伊德里斯·德克vs也许
一个人可以用Error handling 伊德里斯·德克vs也许,error-handling,idris,theorem-proving,maybe,Error Handling,Idris,Theorem Proving,Maybe,一个人可以用Dec来表达什么样的东西,而不是在Idris中用来表达什么样的东西 或者换句话说:什么时候应该选择十二月,什么时候可能。 使用Dec有两个原因: 您希望证明一些事情,并从实现中获得更多的保证 您希望函数在有限时间内运行 关于1。考虑这个函数 NAT 等式: natEq : (n: Nat) -> (m: Nat) -> Maybe (n = m) natEq Z Z = Just Refl natEq Z (S k) = Nothing natEq (S k) Z = N
Dec
来表达什么样的东西,而不是在Idris中用来表达什么样的东西
或者换句话说:什么时候应该选择十二月,什么时候可能。
使用Dec有两个原因:
您希望证明一些事情,并从实现中获得更多的保证
您希望函数在有限时间内运行
关于1。考虑这个函数<代码> NAT <代码>等式:
natEq : (n: Nat) -> (m: Nat) -> Maybe (n = m)
natEq Z Z = Just Refl
natEq Z (S k) = Nothing
natEq (S k) Z = Nothing
natEq (S k) (S j) = case natEq k j of
Nothing => Nothing
Just Refl => Just Refl
您可以为这个函数编写测试,看看它是否工作。但编译器不能在编译时阻止您在任何情况下都不编写任何内容。这样的函数仍然是可编译的可能是某种弱证据。这意味着,如果您只返回就可以找到答案,我们很好,但如果您返回什么都没有
就没有任何意义。你就是找不到答案。但是当您使用Dec
时,不能只返回No
。因为如果你返回的是No
,这意味着你可以证明没有答案。因此,将natEq
重写为Dec
需要程序员付出更多的努力,但实现现在更加健壮:
zeroNotSucc : (0 = S k) -> Void
zeroNotSucc Refl impossible
succNotZero : (S k = 0) -> Void
succNotZero Refl impossible
noNatEqRec : (contra : (k = j) -> Void) -> (S k = S j) -> Void
noNatEqRec contra Refl = contra Refl
natEqDec : (n: Nat) -> (m: Nat) -> Dec (n = m)
natEqDec Z Z = Yes Refl
natEqDec Z (S k) = No zeroNotSucc
natEqDec (S k) Z = No succNotZero
natEqDec (S k) (S j) = case natEqDec k j of
Yes Refl => Yes Refl
No contra => No (noNatEqRec contra)
关于2Dec
代表可判定性。这意味着您只能针对可判定的问题返回Dec
,即可以在有限时间内解决的问题。您可以在有限的时间内求解Nat
等式,因为您最终会陷入Z
的情况。但对于一些困难的事情,比如,检查给定的字符串是否代表计算前10个素数的Idris程序,您不能 也许你会发现阅读标准库中函数的定义很有帮助或有趣,它“决定‘Maybe’是否为‘Just’”。