Agda 中的大小类型是什么?我试图阅读有关MiniAgda的论文,但由于以下几点未能继续:
- 为什么数据类型在它们的大小上是通用的?据我所知,大小是归纳树的深度。
- 为什么数据类型在它们的大小上是协变的,即 i <= j -> T_i <= T_j ?
>
和模式是什么#
意思?
sized data
时,编译器会检查结果是否为具有正确大小的类型,例如,succ
inSNat
将大小增加 1。这样,对于已调整大小的类型S
(i : Size) -> S i
本质上是S
具有 size的元素i
。对我来说看起来很奇怪的是为什么零的定义SNat
是zero : (i : Size) -> SNat ($ i)
而不是像zero : (i : Size) -> SNat ($ 0)
.如第 2.3 节所述,#
等价于 T_∞,即 T 中没有已知大小界限的元素类型;这是子类型预排序中 T_i 的顶部元素。模式 (i > j) 用于绑定大小 j,同时保留 j < i 的信息。论文中的减号示例清楚地说明了这一点:
fun minus : [i : Size] -> SNat i -> SNat # -> SNat i
{ minus i (zero (i > j)) y = zero j
; minus i x (zero .#) = x
; minus i (succ (i > j) x) (succ .# y) = minus j x y
}
首先,签名意味着SNat #
从最多 i 个大小的数字(这就是SNat i
意思)中减去任何数字(是一个没有大小限制信息的数字)返回最多 i 个大小的数字;对于>
模式,在最后一行中,我们使用它来匹配最多 j 的多个大小,并且由于子类型:递归调用类型检查SNat j ≤ SNat i
。