Agda类型检查错误

时间:2015-12-17 04:08:06

标签: typechecking operation agda

我目前正在制作一个有序的矢量数据类型,我正在尝试从数据类型创建操作,但是我收到一个错误:

(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

1 个答案:

答案 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)