簡體   English   中英

Agda類型檢查錯誤

[英]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模塊

http://lpaste.net/147233

首先,類型[_]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM