我有一个数据结构
record IdentityPreservingMorphism domain codomain where
constructor MkMorphismOfMonoids
func : domain -> codomain
funcRespId : (Monoid domain, Monoid codomain) => func (Algebra.neutral) = Algebra.neutral
这只是说IdentityPreservingMorphism
是类半体之间的一种态,需要尊重同一性。
我试图证明身份同构是IdentityPreservingMorphism
monoidIdentity : Monoid m => MorphismOfMonoids m m
monoidIdentity = MkMorphismOfMonoids
id
?respId
?respId
处Refl
的轻松拍摄不起作用,因为可用的Monoid
实例太多。如何告诉编译器我只想使用来自monoidIdentity
定义的实例?
答案 0 :(得分:2)
“适当”的解决方案要求(1)编写形式(m1 : Monoid m, m2 : Monoid m) => m1 = m2
的证明,以及2)能够对Monoid
中的两个funcRespId
实现进行验证,以将其导入步骤1.虽然可以使用假定/断言来模拟前者,但后者却变得有问题,这可能与https://github.com/idris-lang/Idris-dev/issues/4591有关。
一个更简单的解决方法是通过将实现直接存储在记录中来简化验证:
record MorphismOfMonoids domain codomain where
constructor MkMorphismOfMonoids
func : domain -> codomain
mon1 : Monoid domain
mon2 : Monoid codomain
funcRespId : func (Algebra.neutral @{mon1}) = Algebra.neutral @{mon2}
monoidIdentity : Monoid m => MorphismOfMonoids m m
monoidIdentity @{mon} = MkMorphismOfMonoids id mon mon Refl