functional-programming - 评估值相等时发生类型不匹配
问题描述
我是 Idris 的初学者并试图使代码有效。
你能告诉我关于伊德里斯的菜鸟问题的更好地方吗?
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) = filter {len=l} p xs
in if p x then
((FS a) ** x::tail)
else
((weaken a) ** tail)
我写了另一个filter
还不能通过类型检查的。
这种新filter
的 's 类型意味着过滤后的向量不能长于原始向量。
然而,伊德里斯说
...
Specifically:
Type mismatch between
finToNat a
and
finToNat (weaken a)
我们知道这两个术语总是具有相同的值。
我该如何描述事实并让伊德里斯说好?
解决方案
你必须证明这一点finToNat a = finToNat (weaken a)
。tail
有 type Vect (finToNat a) elem
,但您需要Vect (finToNat (weaken a)) elem
最后一行中的第二个组件,因为您weaken 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))
推荐阅读
- python - 如何锁定使用数据库读取、插入和 Web 访问来防止并发访问的复杂操作?
- python - psutil 和资源库输出到文件使用正则表达式解析文件并获取编号
- ckeditor - CkEditor5 在哪里存储评论
- c# - .netcore 3.1 应用程序在哪里可以获得 appsettings.json?
- css - CSS Flexbox,内容从右到左,右对齐,底部对齐
- python - 如何在我的 numpy 数组中创建这个分区?
- android - 运行颤振医生时出错--android-licenses
- node.js - 如何在通用池中使用 maxClientWaings?
- javascript - 减少数组javascript中的数组
- typescript - 将 Behavior 主题集成到 Typescript 应用程序中