在以下数据类型中,
data _≡_ {A : Set} (x : A) : A → Set where
refl : x ≡ x
我试图理解这个:
如果
A
的类型为Set
且隐式且x
是第一个参数且类型为A
,那么这将构造类型{{1}的数据}}
请解释一下。我没有从构造函数A → Set
中获得第二个x
的位置。
答案 0 :(得分:4)
这里的关键区别在于参数(在这种情况下为A
和x
)和 indices (A
in A → Set
)。
参数位于数据声明中冒号的左侧。它们属于该类型的范围,并且可能不会变化(因此它们的名称)。这使您可以编写List
等数据声明,其中List
中包含的元素类型一劳永逸地被声明:
data List (A : Set) : Set where
nil : List A
cons : A → List A → List A
而不是必须在每个具有∀ A →
:
data List : Set → Set1 where
nil : ∀ A → List A
cons : ∀ A → A → List A → List A
索引位于数据声明中冒号的右侧。它们可以是由构造函数引入的新变量,也可以约束为等于其他项。
如果你使用自然数,你可以建立一个谓词,表明数字不是zero
,如下所示:
open import Data.Nat
data NotZero : (n : ℕ) → Set where
indeed1 : NotZero (suc zero)
indeed2+ : ∀ p → NotZero (suc (suc p))
这里,数据声明的类型签名中提到的n
是一个索引。它受不同构造函数的约束:indeed1
表示n
为1
而indeed2+
表示n
的形状为suc (suc p)
。
回到你在问题中引用的声明,我们可以用完全明确的等效形式重新表述:
data Eq (A : Set) (x : A) : (y : A) → Set where
refl : Eq A x x
我们在此处看到Eq
有两个参数(A
是一个集合,x
是A
的元素)和一个索引y
我们声称等于x
的东西。 refl
指出构建两个x
和y
两个事物相同的证据的唯一方法是它们是否完全相同;它将y
限制为x
。