types - 如何理解 agda 中的数据与记录功能?
问题描述
为什么自定义单位类型不允许我们证明这个基本的左单位定律?我看到我的实现与标准库的实现之间的唯一区别是使用了Record
vsData
归纳归纳类型模型。我不明白为什么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
是 adata
而不是record
。
Agda 为否定类型实现了 eta 规则。
记录是负面的,因此有与之相关的 eta 规则。的 eta 规则
record Unit : Set where
constructor unit
是
_ : (u : Unit) -> u ≡ unit
_ = λ u -> refl
理论上支持正类型的 eta-equality 是可能的,但 Agda 没有实现这一点。
推荐阅读
- android - React Native - 相机中的覆盖
- c - 如果数据仅在返回 C 函数时可用,如何使用 LLDB 自动捕获输出数据?
- excel-formula - 双重过滤器在excel中查找特定单元格的位置
- jira - JIRA 简单脚本验证器 - 检查是否选中了所有复选框
- java - 如何在java代码中设置mybatis mapper xml文件。并使用光
- mysql - 如何将多列连接为多列?
- reactjs - React redux:无法在不可变的记录上设置
- java - 如何创建一个产生数学问题的程序
- google-sheets - 如何使用 IF 根据其他列中的值显示值
- c# - 使用计时器调用内部循环的方法不会停止循环中的方法