
Hello, List! I got error: Duplicate instance declarations: instance [overlap ok] EnumTag a => Read a -- Defined at /XXX/intero/intero2932Xpa-TEMP.hs:110:27 instance [overlap ok] StrTag a => Read a -- Defined at /XXX/intero/intero2932Xpa-TEMP.hs:121:27 (intero) For this code: class (Show a, Enum a) => EnumTag a where anyEnum :: a instance {-# OVERLAPS #-} EnumTag a => Read a where readPrec = RP.lift P.skipSpaces >> expectEnum instance {-# OVERLAPS #-} EnumTag a => Eq a where a == b | a == anyEnum || b == anyEnum = True | otherwise = fromEnum a == fromEnum b class StrTag a where anyStr :: a tagPrefix :: a -> String -- ^ should be constant toStr :: String -> a instance {-# OVERLAPS #-} StrTag a => Read a where readPrec = parens $ do RP.lift P.skipSpaces (RP.lift $ expectShown anyStr) <++ RP.lift g where g = do Just s@(_:_) <- L.stripPrefix tagPrefix <$> expectTag return $ toStr s Why does it happen? `Read a` in 1st instance is valid only when a is `EnumTag`, in 2nd one - is valid only when a is `StrTag`. How can I fix this error and to create "default" instances for `EnumTag` and to `StrTag`, so client code will "inherit" those functionality (`Read`) simple, only with instantiation of `EnumTag` or `StrTag` ? Sure, if I comment `instance ... StrTag a` then all work fine, but I need 2 specialized `Read`s (and `Eq`s too :) === Best regards, Paul