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)
    

    关于2
    Dec
    代表可判定性。这意味着您只能针对可判定的问题返回
    Dec
    ,即可以在有限时间内解决的问题。您可以在有限的时间内求解
    Nat
    等式,因为您最终会陷入
    Z
    的情况。但对于一些困难的事情,比如,检查给定的
    字符串是否代表计算前10个素数的Idris程序,您不能

    也许你会发现阅读标准库中函数的定义很有帮助或有趣,它“决定‘Maybe’是否为‘Just’”。