我目前正在制作一个有序的矢量数据类型,我正在尝试从数据类型创建操作,但是我收到一个错误:
(Set (.Agda.Primitive.lsuc ℓ)) != Set
when checking that the expression A has type Set ℓ
这是数据类型
module ordered-vector (A : Set) (_<A_ : A → A → ) where
data ordered- : {A : Set}→ A → ℕ → Set where
[] : {a : A} → ordered- a 0
_::_ : (head : A) {min : A} → {n : ℕ} → (tail : ordered- min n) → true (min <A head) → ordered- head (suc n)
这就是操作:
[_]o : ∀ {ℓ} {A : Set ℓ} → A → ordered- A 1
[ x ]o = x :: []
我相信以下代码对于数据类型更正确。如何保留定义缺点的正确性?
data ordered- {ℓ} (A : Set ℓ) : ℕ → Set ℓ where
[] : ordered- A 0
_::_ : (head : A) {min : A} → {n : ℕ} → ordered- min n → true (min <A head) → ordered- head (suc n)
这是nat模块
答案 0 :(得分:2)
首先,[_]o
的类型没有多大意义,因为您传递的参数的类型(x
的类型)为索引到ordered-
;我相信你正在努力
[_]o : ∀ {ℓ} {A : Set ℓ} → (a : A) → ordered- a 1
代替。
如果您相应地更改[_]o
的类型,您仍会收到错误消息
(Set ℓ) != Set
when checking that the expression a has type A
这是因为您对[_]o
的定义试图为级别多态,但您对ordered-
的定义不是。
你可以[_]o
“dumber”:
[_]o : ∀ {A : Set} → (a : A) → ordered a 1
[ x ]o = x ∷ []
或使ordered-
“更聪明”:
data ordered- {ℓ} {A : Set ℓ} : A → ℕ → Set ℓ where
[] : {a : A} → ordered- a 0
_∷_ : (head : A) {min : A} → {n : ℕ} → (tail : ordered- min n) → true (min <A head) → ordered- head (suc n)
但是,如果您希望A
和_<A_
成为模块的参数,我认为这完全是错误的方法,ordered-
应该只是参数选择完全A
:
module ordered-vector (A : Set) (_<A_ : A → A → ) where
data ordered- : A → ℕ → Set where
[] : {a : A} → ordered- a 0
_∷_ : (head : A) {min : A} → {n : ℕ} → (tail : ordered- min n) → true (min <A head) → ordered- head (suc n)