Functional programming 当计算值相等时,会发生类型不匹配

Functional programming 当计算值相等时,会发生类型不匹配,functional-programming,idris,dependent-type,Functional Programming,Idris,Dependent Type,我是Idris的初学者,试图使代码有效 你能告诉我关于Idris的noob问题的好地方吗 我写了另一个过滤器,它还不能通过类型检查 这个新的过滤器的类型意味着过滤后的向量不能比原始向量长 然而,伊德里斯说 ... Specifically: Type mismatch between finToNat a and finToNat (we

我是Idris的初学者,试图使代码有效

你能告诉我关于Idris的noob问题的好地方吗

我写了另一个
过滤器
,它还不能通过类型检查

这个新的
过滤器
的类型意味着过滤后的向量不能比原始向量长

然而,伊德里斯说

...
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))