У меня есть следующий код (преобразование аналогичен преобразование)Как разрешить перекрывающийся экземпляр
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
Конечно, эти экземпляры перекрываться в том случае, когда я пытаюсь превратить Either a b
в Either a b
и получить следующий сообщение об ошибке (ParsingError
типа псевдоним 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
Я пробовал различные комбинации из OVERLAPS
, OVERLAPPING
и OVERLAPPABLE
, но ничего не работает. Как я могу это решить?
Я попытался прочитать руководство пользователя, но я ничего не понимаю. Не могли бы вы объяснить разницу между 'Transformable a a' и' a ~ b => Transformable a b' и почему один является инкорпорированным, тогда как другой - в порядке. Они выглядят одинаково для меня. – mb14
@ mb14, сложность документации для 'OverlappingInstances' является одной из вещей, которые убедили меня, что это плохая идея. С тех пор я видел немало доказательств того, что это «навязчивый», ломающий всевозможную доброжелательную интуицию. Я действительно не поклонник. – dfeuer
@dfeur Согласен, однако в этом случае у меня действительно нет выбора. Наиболее раздражает то, что эти перекрывающиеся экземпляры на самом деле являются реализацией, поэтому на практике нет перекрытия. Кроме того, у меня не было бы этой проблемы, если бы я мог добавить ограничение неравенства в любом экземпляре. – mb14