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