Я пишу свою собственную формализацию базовой алгебры в Агде.Я определил следующее:
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
.В объектно-ориентированном мире это, вероятно, просто метод для класса.
Учебное пособие Чалмерса по записям , похоже, не дает ответа; стандартная библиотека , кажется, делает это вместо этого, определяя кольцо как запись со всей структурой группы на верхнем уровне вместе с доказательством того, что компоненты структуры группы действительно формируют группу.Я думаю, что это немного грязно, так как у нас уже есть тип, который представляет группы;это может быть чище, если запись звонка может попасть в группу, которую она содержит.Это возможно?