Functional programming 当计算值相等时,会发生类型不匹配
我是Idris的初学者,试图使代码有效 你能告诉我关于Idris的noob问题的好地方吗 我写了另一个Functional programming 当计算值相等时,会发生类型不匹配,functional-programming,idris,dependent-type,Functional Programming,Idris,Dependent Type,我是Idris的初学者,试图使代码有效 你能告诉我关于Idris的noob问题的好地方吗 我写了另一个过滤器,它还不能通过类型检查 这个新的过滤器的类型意味着过滤后的向量不能比原始向量长 然而,伊德里斯说 ... Specifically: Type mismatch between finToNat a and finToNat (we
过滤器
,它还不能通过类型检查
这个新的过滤器
的类型意味着过滤后的向量不能比原始向量长
然而,伊德里斯说
...
Specifically:
Type mismatch between
finToNat a
and
finToNat (weaken a)
我们知道这两项的值总是相同的
我如何描述事实并让Idris说ok?你必须证明
finToNat a=finToNat(弱化a)
tail
具有类型Vect(finToNat a)elem
,但最后一行中的第二个组件需要Vect(finToNat(弱化a))elem
,因为您在第一对组件中编写了弱化a
lemma : {n : _} -> (a : Fin n) -> finToNat (weaken a) = finToNat a
lemma FZ = Refl
lemma (FS x) = rewrite lemma x in Refl
filter : (elem -> Bool) -> Vect len elem -> (p: (Fin len) ** Vect (finToNat p) elem)
filter {len=S l} p xs = ((FZ {k=l}) ** [])
filter {len=S l} p (x::xs) =
let (a ** tail) = Main.filter {len=l} p xs
in if p x then
((FS a) ** x::tail)
else
(weaken a ** (rewrite lemma a in tail))
lemma : {n : _} -> (a : Fin n) -> finToNat (weaken a) = finToNat a
lemma FZ = Refl
lemma (FS x) = rewrite lemma x in Refl
filter : (elem -> Bool) -> Vect len elem -> (p: (Fin len) ** Vect (finToNat p) elem)
filter {len=S l} p xs = ((FZ {k=l}) ** [])
filter {len=S l} p (x::xs) =
let (a ** tail) = Main.filter {len=l} p xs
in if p x then
((FS a) ** x::tail)
else
(weaken a ** (rewrite lemma a in tail))