如何理解 agda 中的数据与记录功能?
How does one understand Data vs Record capabilities in agda?
为什么自定义单位类型不允许我们证明这个基本的左单位定律?我看到我的实现与标准库的实现之间的唯一区别是使用 Record
与 Data
inductive inductive type former。我不明白为什么 Data
不允许我证明这个基本的左恒等式引理,它在定义上应该是正确的。它与Record
的自动eta继承有关吗?如果是这样,为什么会这样?是否可以在没有内置(例如 Record
)单位类型的情况下证明这一点?总的来说,这是Data
的限制,还是agda模记录中的一切都可以做?
data _≡_ {A : Set} : A → A → Set where
refl : (a : A) → a ≡ a
--from builtin
lunitm : (f : ⊤ → ⊤) → (λ x → f tt) ≡ f
lunitm f = refl (λ x → tt)
data ⊤2 : Set where
tt2 : ⊤2
lunitm2 : (f : ⊤2 → ⊤2) → (λ x → f tt2) ≡ f
lunitm2 f = ? --refl ? --can't instantiate
这确实是因为 ⊤2
是 data
而不是 record
。
Agda 为 negative types.
实施 eta 规则
记录是负面的,因此有与之相关的 eta 规则。
的eta规则
record Unit : Set where
constructor unit
是
_ : (u : Unit) -> u ≡ unit
_ = λ u -> refl
支持正类型的 eta-equality 是 possible in theory,但 Agda 没有实现它。
为什么自定义单位类型不允许我们证明这个基本的左单位定律?我看到我的实现与标准库的实现之间的唯一区别是使用 Record
与 Data
inductive inductive type former。我不明白为什么 Data
不允许我证明这个基本的左恒等式引理,它在定义上应该是正确的。它与Record
的自动eta继承有关吗?如果是这样,为什么会这样?是否可以在没有内置(例如 Record
)单位类型的情况下证明这一点?总的来说,这是Data
的限制,还是agda模记录中的一切都可以做?
data _≡_ {A : Set} : A → A → Set where
refl : (a : A) → a ≡ a
--from builtin
lunitm : (f : ⊤ → ⊤) → (λ x → f tt) ≡ f
lunitm f = refl (λ x → tt)
data ⊤2 : Set where
tt2 : ⊤2
lunitm2 : (f : ⊤2 → ⊤2) → (λ x → f tt2) ≡ f
lunitm2 f = ? --refl ? --can't instantiate
这确实是因为 ⊤2
是 data
而不是 record
。
Agda 为 negative types.
实施 eta 规则记录是负面的,因此有与之相关的 eta 规则。
的eta规则record Unit : Set where
constructor unit
是
_ : (u : Unit) -> u ≡ unit
_ = λ u -> refl
支持正类型的 eta-equality 是 possible in theory,但 Agda 没有实现它。