Agda记录:字段别名

时间:2018-06-09 21:54:17

标签: agda

我正在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>

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

我想要做的是不为_+_提供构造函数,而是让它自动作为字段提供(并且其值等于_._上的additiveGroup字段)每当构造ring时。 在面向对象的世界中,这可能只是该类的一种方法。

Chalmers tutorial on records似乎没有给出答案; standard library似乎是通过将一个环定义为顶级所有组结构的记录,以及组结构组件形成一个组的证明来实现此目的。我觉得这有点乱,因为我们已经有了一个代表群体的类型;如果戒指记录可以达到它所包含的组,那么它可能会更清晰。这可能吗?

1 个答案:

答案 0 :(得分:4)

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

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

这非常类似于OO语言中的类方法。您甚至可以通过启动新的field块来在定义后面添加更多字段。