重新布线我自己的 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.::
所以我想我迷路了...
你对 Vect
和 append
的定义在我看来很好,但问题在于你如何创造价值。您将类型构造函数 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
我试图重新实现 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.::
所以我想我迷路了...
你对 Vect
和 append
的定义在我看来很好,但问题在于你如何创造价值。您将类型构造函数 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