<div dir="ltr">For derived instances I'm getting decls that aren't allowed if I try to put them explicitly. They're rejected as overlapping, and in no substitution ordering.<div><br></div><div>>    import Hugs.Trex<br>>    <br>>    type UserId = Int<br>>    type EventId = Int<br>>    <br>>    data Message <br>>      = SendChat (Rec ( message :: String,  user :: UserId ))<br>>      | Signup   (Rec ( eventId :: EventId, user :: UserId ))<br>>      deriving (Eq)<br></div><div>></div><div><br></div><div>There's an `instance Eq Message` -- fine.</div><div><br></div><div>From Hugs.Trex I get (and these are fine)</div><div><br></div><div>>    instance EqRecRow a => Eq (Rec a)                -- pass through to a specialised class</div><div>>    instance EqRecRow EmptyRow</div><div><br></div><div>These are generated by the `deriving`; note they're not specialised to the field's type, nor for rows with combinations of labels:</div><div><br></div><div>>      instance (Eq a, b\eventId, EqRecRow b) => EqRecRow (eventId :: a | b)</div>>      instance (Eq a, b\user, EqRecRow b) => EqRecRow (user :: a | b)<br>>      instance (Eq a, b\message, EqRecRow b) => EqRecRow (message :: a | b)<div><br></div><div>Not specialising and not combining labels makes sense: then no clash if I also had:</div><div><br></div><div>>    data Probe a b c<br>>      = MkProbe (Rec (user :: a, message :: b, eventId :: c))<br>>      deriving (Eq)             <br><br>But those generated instances for `EqRecRow` overlap in no substitution ordering -- as Hugs tells me if I try to declare them explicitly. How does a wanted for `(MkProbe x) == (MkProbe y)` resolve to the wanted instances? There's no preference ordering -- or is there?</div><div><br></div><div>Precisely because it's Trex where records are considered isomorphic up to permutation of labels; and because each instance has an `EqRecRow b` constraint for the rest of the row; it doesn't matter how Hugs resolves the wanted to the instances: it'll get to the same answer. But I don't see how this fits with Hugs usual approach for overlaps.</div><div><br></div><div>AntC<br><div><br></div></div></div>