重新布线我自己的 Vect 但遇到问题

Rewiring my own Vect but encountering issues

我试图重新实现 Vect 数据类型以更加熟悉依赖类型。这是我写的:

data Vect : (len : Nat) -> (elem : Type) -> Type where
  Nil : Vect Z elem
  (::) : (x : elem) -> (xs : Vect len elem) -> Vect (S len) elem

append : Vect n elem -> Vect m elem -> Vect (n + m) elem
append [] y = y
append (x :: xs) y = x :: append xs y

我可以定义,例如 Vect 4 Nat 等等。但是如果我尝试 append (Vect 4 Nat) (Vect 3 Nat) 我会得到一个我无法解析的错误:

When checking an application of function Main.append:
        Type mismatch between
                Type (Type of Vect len elem)
        and
                Vect n elem (Expected type)

显然我的思考方式有问题。

有什么建议吗?

另外,当我尝试创建 Vect 4 [1,2,3,4] 时出现错误:

When checking argument elem to type constructor Main.Vect:
        Can't disambiguate since no name has a suitable type: 
                Prelude.List.::, Main.::, Prelude.Stream.::

所以我想我迷路了...

你对 Vectappend 的定义在我看来很好,但问题在于你如何创造价值。您将类型构造函数 Vect 与数据构造函数 Nil:: 混淆了。您应该通过调用 Nil::.

创建类型 Vect len elem 的值

特别是,Vect 4 Nat 是一种类型,但 append 期望该类型的值,例如 1 :: 2 :: 3 :: 4 :: Nil(或 [1,2,3,4] 只是语法糖前者)。

并且 Vect 4 [1,2,3,4] 是不可能的,因为 [1,2,3,4] 是一个值而不是 Type