[英]Agda Type-Checking Error
我目前正在制作有序向量數據類型,並且嘗試從該數據類型創建操作,但出現錯誤:
(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模塊
首先,類型[_]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-𝕍
定義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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.