[Haskell-cafe] GATD and pattern matching

wren ng thornton wren at freegeek.org
Sat Jun 12 04:19:27 EDT 2010


Felipe Lessa wrote:
> Well, I guess it can't be compiled at all :(
> [...]
>   T.lhs:4:12:
>       Duplicate instance declarations:
>         instance [incoherent] (Show a) => MaybeShow a
>           -- Defined at T.lhs:4:12-32
>         instance [incoherent] MaybeShow a -- Defined at T.lhs:7:12-22

Indeed, it can't be compiled because contexts don't work like that :)


> I think this solution still requires OverlappingInstances and
> UndecidableInstances.

The standard solution for this kind of thing is to use a newtype wrapper 
to capture the Show constraint, define the Nothing instance for @a@, and 
use IncoherentInstances. It's ugly, but it works... mostly.

It works best if you're in an architecture where everything is a 
functor--- e.g., if you're using the Data Types a la Carte[1] trick. 
That way you can enforce the discipline of using the newtype wrapper, 
since you'll have to be using some kind of functor wrapper to get things 
to typecheck. Otherwise, it can be too easy to forget to tag something 
as Showable, and then you'll end up using the default Nothing instance 
when you didn't mean to.


[1] http://www.cs.nott.ac.uk/~wss/Publications/DataTypesALaCarte.pdf

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list