Ho il seguente codice (trasformare è simile per convertire)Come risolvere la sovrapposizione esempio
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
Naturalmente, quei casi si sovrappongono nel caso in cui sto cercando di trasformare Either a b
-Either a b
e ottenere il seguente messaggio di errore (ParsingError
è un tipo alias per 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
ho provato diverse combinazioni di OVERLAPS
, OVERLAPPING
e OVERLAPPABLE
ma non funziona niente. Come posso risolvere questo ?
Ho provato a leggere la guida dell'utente ma non capisco nulla. Potresti spiegare la differenza tra 'Trasformabile a a' e' a ~ b => Trasformabile a b' e perché uno è incorporo mentre l'altro è ok. Hanno lo stesso aspetto per me. – mb14
@ mb14, la complessità della documentazione di 'OverlappingInstances' è una delle cose che mi ha convinto che è una cattiva idea. Da allora ho visto una buona prova che è "invadente", rompendo ogni sorta di intuizione altrimenti buona. Non sono davvero un fan. – dfeuer
@dfeur Sono d'accordo, tuttavia in quel caso non ho davvero la scelta. Il più fastidioso è che quelle istanze sovrapposte hanno in effetti l'implementazione, quindi in pratica non c'è sovrapposizione. Inoltre, non avrei questo problema se potessi aggiungere un vincolo di disuguaglianza nell'istanza Either. – mb14