Ich habe den folgenden Code (Transform ähnelt konvertieren)Wie Instanz überlappend lösen
instance {-# OVERLAPS #-} Transformable a a where
transform x = x
instance {-# OVERLAPPABLE #-} (Transformable l l', Transformable r r')
=> Transformable (Either l r) (Either l' r')
where
transform = bimap transform transform
Natürlich diese Instanzen im Fall überlappen, wo ich versuche Either a b
-Either a b
zu transformieren und die folgende erhalten Fehlermeldung (ParsingError
ist eine Art Alias für Either something somethingElse
)
Overlapping instances for Transformable
(parsingerror text) (parsingerror text)
arising from a use of ‘makereceipt’
matching instances:
Matching instances: Overlapping instances for Transformable
(ParsingError Text) (ParsingError Text)
arising from a use of ‘makeReceipt’
Matching instances:
instance [overlappable] (Transformable l l', Transformable r r') =>
Transformable (Either l r) (Either l' r')
instance [overlappable] (Transformable l l', Transformable r r') =>
Transformable (Either l r) (Either l' r')
-- Defined at Handler/GLEnterReceiptSheet/ReceiptRow.hs:154:31
instance [overlap ok] Transformable a a
-- Defined at Handler/GLEnterReceiptSheet/ReceiptRow.hs:151:27
ich andere Kombination von OVERLAPS
, OVERLAPPING
und OVERLAPPABLE
aber nichts funktioniert versucht. Wie kann ich das lösen?
Ich habe versucht, das Benutzerhandbuch zu lesen, aber ich verstehe nichts. Könntest du den Unterschied erklären zwischen "Transformable a a" und "a ~ b => Transformable a b" und warum man inkorrekt ist, während das andere in Ordnung ist. Sie sehen für mich gleich aus. – mb14
@ mb14, ist die Komplexität der Dokumentation für "OverlappingInstances" eines der Dinge, die mich davon überzeugt haben, dass es eine schlechte Idee ist. Seitdem habe ich eine Menge Beweise dafür gesehen, dass es "aufdringlich" ist und alle möglichen guten Intuitionen bricht. Ich bin wirklich kein Fan. – dfeuer
@dfeur Ich stimme zu, aber in diesem Fall habe ich nicht wirklich die Wahl. Am ärgerlichsten ist, dass diese überlappenden Instanzen tatsächlich die Implementierung haben, so dass es in der Praxis keine Überlappung gibt. Außerdem hätte ich dieses Problem nicht, wenn ich eine Ungleichheitsbedingung für die EASY-Instanz hinzufügen könnte. – mb14