类钻石的界面约束问题

时间:2018-10-02 06:57:37

标签: typeclass idris theorem-proving type-constraints

我已经编写了一个ApplicativeVerifiedApplicative的实现,该对具有一个等边线对:

import Interfaces.Verified

VerifiedMonoid a => Applicative (Pair a) where
    (l, f) <*> (r, x) = (l <+> r, f x)
    pure x = (neutral, x)

VerifiedMonoid a => VerifiedApplicative (Pair a) where
    applicativeMap (l, x) g = sym $ cong {f=(\y => (y, g x))} (monoidNeutralIsNeutralR l)
    applicativeIdentity = ?h1
    applicativeComposition = ?h2
    applicativeHomomorphism = ?h3
    applicativeInterchange = ?h4

尽管它可以编译,但是如果我在a实例中的Applicative上削弱条件,则如下所示:

Monoid a => Applicative (Pair a) where
    (l, f) <*> (r, x) = (l <+> r, f x)
    pure x = (neutral, x)

我在applicativeMap上看到一条错误消息:

When checking right hand side of Interfaces.Verified.Contravariant.Pair a implementation of Interfaces.Verified.VerifiedApplicative, method applicativeMap with expected type
        map g (l, x) = pure g <*> (l, x)

When checking an application of function Prelude.Basics.cong:
        Type mismatch between
                (<+>) {{constructor of Interfaces.Verified.VerifiedSemigroup#Semigroup a {{constructor of Interfaces.Verified.VerifiedMonoid#VerifiedSemigroup a}}}}
                      neutral
                      l =
                l (Type of monoidNeutralIsNeutralR l)
        and
                (<+>) {{constructor of Prelude.Algebra.Monoid#Semigroup ty {{constructor of Interfaces.Verified.VerifiedMonoid#Monoid a}}}} neutral l = l (Expected type)

        Specifically:
                Type mismatch between
                        (<+>) {{constructor of Interfaces.Verified.VerifiedSemigroup#Semigroup a {{constructor of Interfaces.Verified.VerifiedMonoid#VerifiedSemigroup a}}}}
                              neutral
                              l
                and
                        (<+>) {{constructor of Prelude.Algebra.Monoid#Semigroup ty {{constructor of Interfaces.Verified.VerifiedMonoid#Monoid a}}}}
                              neutral
                              l

由于显示了Semigroup ty,因此显然无法推断出Semigroup实例。我试图将其明确地写为(Semigroup a, VerifiedMonoid a) => VerifiedApplicative (Pair a),但这无济于事。

Semigroup => Monoid => VerifiedMonoid开始,同时在Semigroup => VerifiedSemigroup => VerifiedMonoid,这也是钻石继承的问题。

任何想法如何解决此问题?仅在Applicative上限制VerifiedMonoid实例有点尴尬。

0 个答案:

没有答案