types - 伊德里斯印章的类型
问题描述
我正在尝试chop
在 Idris 中编写一个函数。Haskell 等价物看起来像:
chop :: Int -> [t] -> [[t]]
chop n [] = []
chop n v = take n v : chop n (drop n v)
我在 Idris 的初步尝试如下:
chop : (n : Nat) -> Vect (k * n) a -> Vect k (Vect n a)
chop n Nil = Nil
chop n v = (take n v) :: (chop n (drop n v))
类型检查错误:
Type mismatch between
Vect 0 a (Type of [])
and
Vect (mult k n) a (Expected type)
Specifically:
Type mismatch between
0
and
mult k n
解决方案
k
仍然可以设置为参数,即chop {k=3} Z []
会导致[[], [], []] : Vect 3 (Vect Z a)
. 您的实现将返回chop n Nil = []
,因此 Idris 的类型系统正确地抱怨。:-)
您需要考虑k
:
chop : (n : Nat) -> Vect (k * n) a -> Vect k (Vect n a)
chop {k} n v = ?hole
如果你想要实际的实现,这里有一个剧透:
它与您的非常相似。因为
mult
递归第一个参数(k
在这种情况下),chop
的递归也应该遵循k
:
chop {k = Z} n v = []
chop {k = (S k)} n v = take n v :: chop n (drop n v)
另一种方法是指定你想要多少块而不是每个块有多大。
chop' : (k : Nat) -> Vect (k * n) a -> Vect k (Vect n a)
chop' Z v = []
chop' {n} (S k) v = take n v :: chop k (drop n v)
n
需要在范围内才能调用take
和drop
。
推荐阅读
- xpath - 如何在 BizTalk 形状中修复 xpath 函数 min()“作为无效令牌”?
- python-sphinx - 使用现有项目设置 Sphinx Autodoc
- php - 禁用链接生成以翻译没有翻译的页面 - TYPO3 9
- javascript - 如何对数组中的偶数升序和奇数降序排序?
- jquery - 使用 Fancybox 将缩略图放置在底部
- javascript - 如何在 React 的引导表中传递自定义道具?
- java - 项目从 Java 6 迁移到 OpenJDK8
- jquery - 有没有更简洁的方法来编写这个 jQuery 下拉代码?
- javascript - 小型反应示例中的导入问题
- xml - Symfony 序列化器 XML 属性