Types 为什么这些声明(对于相同的模式)满足类型检查器的要求?

Types 为什么这些声明(对于相同的模式)满足类型检查器的要求?,types,idris,proof-of-correctness,Types,Idris,Proof Of Correctness,我正在跟随令人惊叹的TDDwI,编写一个简单的removeElem 关于它的四个问题: 为什么我可以为同一个模式编写3个声明 荒谬的和不可能的之间有什么区别 在返回[]的第三种情况下,[]是一个值,因此。。。证明xs有一个a要删除,并且确实。。。对吧? 如果我把这三个都去掉,函数仍然是完整的,我有一种莫名其妙的痒感,觉得有什么奇怪的事情发生了?。(我想这是个问题) 这种情况是不可能的,所以你做什么都无关紧要。如果一等于二,那么月亮是奶酪做的,这是一个正确的说法,因为一不等于二a是类型为unha

我正在跟随令人惊叹的TDDwI,编写一个简单的
removeElem

关于它的四个问题:

  • 为什么我可以为同一个模式编写3个声明

  • 荒谬的
    不可能的
    之间有什么区别

  • 在返回
    []
    的第三种情况下,
    []
    是一个值,因此。。。证明
    xs
    有一个
    a
    要删除,并且确实。。。对吧?

  • 如果我把这三个都去掉,函数仍然是完整的,我有一种莫名其妙的痒感,觉得有什么奇怪的事情发生了?。(我想这是个问题)



  • 这种情况是不可能的,所以你做什么都无关紧要。如果一等于二,那么月亮是奶酪做的,这是一个正确的说法,因为一不等于二
    a
    是类型为
    unhabitedt=>t->a
    的函数。伊德里斯知道情况是不可能的,所以你不必处理它

    您甚至可以通过证明
    vect0a=string

    removeElem : (value : a)
        -> (xs : Vect (S n) a) 
        -> (prf : Elem value xs) 
        -> Vect n a
    removeElem value (value :: ys) Here = ys
    removeElem {n = Z} value (y :: []) (There later) = absurd later -- ??
    removeElem {n = Z} value (y :: []) (There later) impossible     -- ??
    removeElem {a} {n = Z} value (y :: []) (There later) = rewrite (the (Vect 0 a = String) (absurd later)) in "Hi"           -- ??
    removeElem {n = (S k)} value (y :: ys) (There later) = y :: removeElem value ys later
    
    为什么我可以为同一个模式编写3个声明

    因为在本例中(
    y::[]
    )您处理的是一个元素向量。 这意味着
    later
    具有类型
    Elem value[]
    ,即空列表中有一个元素
    value
    ,这是荒谬的。回想一下,
    t
    有类型
    unhabited t=>t->a
    ,意思是“如果一个类型
    t
    是无人居住的,并且你有一个该类型的居住者,那么你可以构造一个任意类型的居住者
    a
    ”。因此,您只需要
    elemx[]
    就可以实现该接口(它是一个简单的接口)。这就是为什么<代码>荒谬之后起作用的原因

    不可能
    之所以有效,是因为Idris能够自行执行上述所有推理

    荒谬的
    不可能的
    之间有什么区别

    不可能
    关键字可以用来排除不进行类型检查的情况,而
    荒谬
    只是一个引理,因此如果使用它,一切都必须进行类型检查

    在返回
    []
    的第三种情况下,
    []
    是一个值,因此。。。证明
    xs
    有一个
    a
    要删除,并且确实。。。对吧?

    是的,没错
    removelem
    获取一个值,一个长度为正的向量,证明该值属于该向量,并返回一个长度递减的向量。如果采用单元素向量,则可以忽略值和证明,并立即返回空向量。我的观点是,你不必使用证据,它会给你额外的保证,但你可以随意忽略它们

    如果我把这三个都去掉,函数仍然是完整的,我有一种莫名其妙的痒感,觉得有什么奇怪的事情发生了

    这里一切正常,函数仍然有效--Idris允许您忽略不可能的情况:

    removeElem {n = Z} value (y :: []) (There later) impossible
    

    “不管你做什么”>你能澄清一下吗?我无法放置其他值而不是
    []
    。我什么时候会选择
    荒谬
    而不是
    不可能
    ?@Josh.F你可以直接返回任何值,因为你可以用荒谬来证明任何事情
    removeElem {n = Z} value (y :: []) (There later) impossible