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
块来在定义之后提供更多字段。
我正在用 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
块来在定义之后提供更多字段。