の重複の解決方法I次のコードもちろんインスタンス
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
の異なる組み合わせを試してみましたが、何も働きません。これをどうすれば解決できますか?
私はユーザーガイドを読もうとしましたが、何も分かりません。 「変形可能なa a」と「a〜b =>変形可能なa b」との違いを説明してください。彼らは私にとっても同じように見えます。 – mb14
@ mb14の場合、「OverlappingInstances」のドキュメントの複雑さは、それが悪い考えであることを私に納得させるものの1つです。それ以来、私はそれが「侵入的」であるという証拠の良いビットを見て、あらゆる種類の良い直感を破った。私は本当にファンではありません。 – dfeuer
@dfeur私は同意するが、その場合、私は本当に選択肢がない。最も厄介なことは、重複しているインスタンスが実際に実装されていることです。したがって、実際にはオーバーラップはありません。また、どちらかのインスタンスに不等理制約を追加できれば、この問題は発生しません。 – mb14