如何理解 agda 中的数据与记录功能?

How does one understand Data vs Record capabilities in agda?

为什么自定义单位类型不允许我们证明这个基本的左单位定律?我看到我的实现与标准库的实现之间的唯一区别是使用 RecordData 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

这确实是因为 ⊤2data 而不是 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 没有实现它。