types - idris 印章类型

标签 types functional-programming idris dependent-type

我正在尝试在 Idris 中编写一个 chop 函数。 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)

另一种方法是指定您想要多少个 block ,而不是每个 block 有多大。

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 .

关于types - idris 印章类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54680863/

相关文章:

parsing - Idris 解析器组合器 GADT

c# - 是什么?是指类型之后?

scala - 使用术语 "Abstract Syntax Tree"

javascript - "combine"以功能方式在 javascript 中运行?

functional-programming - OCaml:模式匹配与 If/else 语句

dependent-type - 如何在 Idris 中为 Vect 编写正确的类型签名?

idris - 给定 (x = y) & (xs = ys) 如何证明 ((x::xs) = (y::ys))

sql-server - SQL Server 中的类型和轮次

Java - 反射如何找到枚举类型

c++ - 如何消除 LoadLibrary() 函数中变量类型不兼容的错误?