agda - 找不到相互列表的表达式类型

agda - type of expression with mutual Lists not found

在 Windows 上的 Agda 2.5.1.1 中,加载以下代码后(对应教程 https://github.com/k0001/tut-agda/blob/master/SetsParametric.agda),C-c C-d 类型检查确实找到类型 List₁ _A_2 _B_3 对于 [] 表达式,但对于任何更结构化的表达式(如 true ∷ [] )没有合理的类型,只返回下划线和数字,如 _5 。请问是什么原因?

教程前面的练习效果很好。

 module Sets.Parametric where

 open import Sets.Enumerated using (Bool; true; false; ⊤; tt)

 data List₁ (A B : Set) : Set
 data List₂ (A B : Set) : Set
 data List₁ (A B : Set) where
  []  :                 List₁ A B
  _∷_ : A → List₂ A B → List₁ A B

data List₂ (A B : Set) where
  _∷_ : B → List₁ A B → List₂ A B

Non-overloaded 构造函数是可推断的,因此可以推断 [] 的类型,但是重载的构造函数只能检查,因此您不能推断类型 true ∷ [] — 只能检查它反对 List₂ Bool A.

否则 type-directed 重载构造函数的解析会太复杂。例如。 _∷_ 的第二个参数的类型可能取决于它的第一个参数,然后弄清楚 _∷_ 属于 List₁ 还是 List₂ 需要解决两个可能的 non-trivial 统一问题(一个用于 List₁,一个用于 List₂)可能会被推迟并保留在内存中,直到清楚 _∷_ 用户的意思。 Agda 已经生成了大量元变量,我看不出有任何理由增加这个数量并使类型检查复杂化以合并这个不是超级有用的特性。