IDRIS-使用相同的接口实例

时间:2019-02-21 17:26:42

标签: idris monoids

我有一个数据结构

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

?respIdRefl的轻松拍摄不起作用,因为可用的Monoid实例太多。如何告诉编译器我只想使用来自monoidIdentity定义的实例?

1 个答案:

答案 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