k
все еще может быть установлен в качестве аргумента, то есть chop {k=3} Z []
приведет к [[], [], []] : Vect 3 (Vect Z a)
.Ваша реализация вернет chop n Nil = []
, поэтому система типов Идриса правильно жалуется.: -)
Вам необходимо учитывать k
:
chop : (n : Nat) -> Vect (k * n) a -> Vect k (Vect n a)
chop {k} n v = ?hole
Если вы хотите фактическую реализацию, вот спойлер:
Другой подход заключается в том, чтобы указать, какмного блоков, которые вы хотите, а не размер каждого блока.
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
.