<div dir="ltr"><br><div>This is driving me nuts.</div><div><br></div><div>So I have a type class HasStructParser I've defined. Details are irrelevant except that if you have HasStructParser defined, then ToJSON is also defined.  So I have:</div><div>    instance HasStructParser s => ToJSON s where</div><div>        ...</div><div><br></div><div>But now, any type that defines ToJSON any other way causes an Overlapping Instances error to happen- the conflict being between the real ToJSON implementation and the one deriving from HasStructParser- this despite the fact that there is no implementation for HasStructParser for the given type.</div><div><br></div><div>Now, I don't want to allow Overlapping Instances because if there are *real* overlapping instances, I want that to be an error.  For instance, if a structure did implement HasStructParser and some other implementation of ToJSON, I want to know.</div><div><br></div><div>I suppose I could go:</div><div><br></div><div>    newtype JSON a = JSON a</div><div><br></div><div>    instance HasStructParser s => ToJSON (JSON s) where ...</div><div><br></div><div>But this strikes me as being ugly- now I have to add pointless JSON constructors everywhere I want to convert to (or from) JSON.  And this also pollutes my type signatures all over the place- now I can't write a servant endpoint type like:</div><div>    :<|> "foo" :> "bar" :> Get '[JSON] [Foo]<br>I have to write:</div><div>    :<|> "foo" :> "bar" :> Get '[JSON] [JSON Foo]<br><br></div><div>And, of course, if I want to have multiple different types of outputs, now we're off to the races.</div><div><br></div><div>So my question is, is there a way to do this without throwing the baby out with the bath water (turning on overloaded instances) or being seriously ugly?  Or am I just screwed?</div><div><br></div><div>Brian</div><div><br></div></div>