Record 有没有更方便的方法来使用嵌套记录?
正如我所说的,我在一个图书馆里学习代数、矩阵和范畴论。我将代数结构分解为一个记录类型的“塔”,每个记录类型代表一个代数结构。例如,为了指定一个幺半群,我们首先定义一个半群,为了定义一个交换幺半群,我们使用幺半群定义,遵循与Agda标准库相同的模式 我的问题是,当我需要一个深入于另一个代数结构中的代数结构的属性时(例如,Record 有没有更方便的方法来使用嵌套记录?,record,agda,Record,Agda,正如我所说的,我在一个图书馆里学习代数、矩阵和范畴论。我将代数结构分解为一个记录类型的“塔”,每个记录类型代表一个代数结构。例如,为了指定一个幺半群,我们首先定义一个半群,为了定义一个交换幺半群,我们使用幺半群定义,遵循与Agda标准库相同的模式 我的问题是,当我需要一个深入于另一个代数结构中的代数结构的属性时(例如,Monoid的属性,它是交换映射的一部分),我们需要使用一些与所需代数结构深度相等的投影 作为我的问题的一个例子,考虑下面的引理: 注意,为了访问幺半群的左恒等式属性,我需要从位于
Monoid
的属性,它是交换映射的一部分),我们需要使用一些与所需代数结构深度相等的投影
作为我的问题的一个例子,考虑下面的引理:
注意,为了访问幺半群的左恒等式属性,我需要从位于交换半环结构中的交换幺半群中的幺半群投影它
我担心的是,随着我添加越来越多的代数结构,这样的引理将变得不可读
我的问题是:是否有一种模式或技巧可以避免记录预测的“阶梯”
这方面的任何线索都是非常受欢迎的。如果您查看Agda标准库,您会发现对于大多数专门化的代数结构,定义它们的记录具有不太专业化的结构open public
。例如,在中国,我们有:
record AbelianGroup c ℓ : Set (suc (c ⊔ ℓ)) where
-- ... snip ...
open IsAbelianGroup isAbelianGroup public
group : Group _ _
group = record { isGroup = isGroup }
open Group group public using (setoid; semigroup; monoid; rawMonoid)
-- ... snip ...
因此,AbelianGroup
记录将不仅具有可用的AbelianGroup
/IsAbelianGroup
字段,而且还具有setoid
、semigroup
和monoid
中的rawMonoid
。反过来,Group
中的setoid
、monoid
和rawMonoid
来自类似的openpublic
——从monoid
重新导出这些字段
类似地,对于代数属性见证,它们会重新导出不太专业化的版本的字段,例如,在we have中
然后IsGroup
重新导出IsMonoid
,IsMonoid
重新导出IsSemigroup
,依此类推。因此,如果您打开了isbeliangroup
,您仍然可以使用assoc
(来自IsSemigroup
),而不必手动写出它的整个路径
底线是您可以按如下方式编写函数:
open CommutativeSemiring CSR hiding (refl)
open import Function using (_⟨_⟩_)
zipWith-replicate-0# : ∀ {n}(xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-replicate-0# [] = refl
zipWith-replicate-0# (x ∷ xs) = proj₁ +-identity x ⟨ cong₂ _∷_ ⟩ zipWith-replicate-0# xs
record IsAbelianGroup
{a ℓ} {A : Set a} (≈ : Rel A ℓ)
(∙ : Op₂ A) (ε : A) (⁻¹ : Op₁ A) : Set (a ⊔ ℓ) where
-- ... snip ...
open IsGroup isGroup public
-- ... snip ...
open CommutativeSemiring CSR hiding (refl)
open import Function using (_⟨_⟩_)
zipWith-replicate-0# : ∀ {n}(xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-replicate-0# [] = refl
zipWith-replicate-0# (x ∷ xs) = proj₁ +-identity x ⟨ cong₂ _∷_ ⟩ zipWith-replicate-0# xs