首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Idris型印章

Idris型印章
EN

Stack Overflow用户
提问于 2019-02-13 23:11:35
回答 1查看 67关注 0票数 2

我试图用Idris编写一个chop函数。Haskell等价物看起来像:

代码语言:javascript
复制
chop :: Int -> [t] -> [[t]]
chop n [] = []
chop n v = take n v : chop n (drop n v)

我在Idris的最初尝试看上去如下:

代码语言:javascript
复制
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))

类型检查错误:

代码语言:javascript
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 2019-02-14 01:31:10

k仍然可以设置为参数,即chop {k=3} Z []将导致[[], [], []] : Vect 3 (Vect Z a)。您的实现将返回chop n Nil = [],因此Idris的类型系统会正确地发出抱怨。:-)

你需要考虑一下k

代码语言:javascript
复制
chop : (n : Nat) -> Vect (k * n) a -> Vect k (Vect n a)
chop {k} n v = ?hole

如果您想要实际的实现,下面是一个扰流器:

这和你的很相似。因为mult在第一个参数上递归(在本例中是k),所以chop的递归也应该遵循kchop {k = Z} n v = [] chop {k = (S k)} n v = take n v :: chop n (drop n v)

另一种方法是指定需要多少块,而不是每个块有多大。

代码语言:javascript
复制
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需要在作用域内调用takedrop

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54680863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档