伊德里斯印章的类型
type of Idris chop
我正在尝试在 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)
。您的实施将 return 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
.
我正在尝试在 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)
。您的实施将 return 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
.