Agda 记录:字段别名

Agda records: field alias

我正在用 Agda 编写我自己的基本代数形式化。我定义了以下内容:

record group {a} {A : Set a} : Set a where
  infixl 7 _·_
  field
      _·_ : A → A → A
      <many other laws>

现在我想定义继承自这个的环:

record ring {a} {A : Set a} : Set a where
  infixl 6 _+_
  infixl 8 _*_
  field
    additiveGroup : group A
    _*_ : A → A
    _+_ = additiveGroup._._
    <the other ring-specific laws, not the group laws>

当然,有问题的行是我在环记录声明中分配给 _+_ 的地方,因为我不能像这样在纯粹的类型定义中分配值。

我想做的是不为 _+_ 提供构造函数,而是让它作为一个字段自动可用(并且它的值等于 [=15] 上的 _._ 字段=]) 每当构造 ring 时。 在面向对象的世界中,这可能只是 class.

上的一个方法

Chalmers tutorial on records doesn't seem to give an answer; the standard library 似乎通过将环定义为顶层所有组结构的记录,以及组结构组件确实形成组的证明来做到这一点。我认为这感觉有点混乱,因为我们已经有了代表组的类型;如果环记录可以深入到它包含的组中,它可能会更清晰。这可能吗?

您可以在记录声明中给出任何定义,而不仅仅是字段。只要确保它们不属于 field 块:

record ring {a} {A : Set a} : Set a where
  infixl 6 _+_
  infixl 8 _*_
  field
    additiveGroup : group A
    _*_ : A → A
  _+_ = group._._ additiveGroup

这非常类似于 OO 语言中的 class 方法。您甚至可以通过启动一个新的 field 块来在定义之后提供更多字段。