我正在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似乎是通过将一个环定义为顶级所有组结构的记录,以及组结构组件形成一个组的证明来实现此目的。我觉得这有点乱,因为我们已经有了一个代表群体的类型;如果戒指记录可以达到它所包含的组,那么它可能会更清晰。这可能吗?
答案 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
块来在定义后面添加更多字段。