[Haskell] really undecidable instances?

Benjamin Franksen benjamin.franksen at bessy.de
Sun Oct 30 17:23:56 EST 2005


On Sunday 30 October 2005 21:59, David Menendez wrote:
> Benjamin Franksen writes:
> > This is the data type declaration:
> > > data Node23 tree a
> > >   = N2 (tree a) a (tree a)
> > >
> > >   | N3 (tree a) a (tree a) a (tree a)
> >
> > and this is the instance, where the error is reported:
> > > instance (Pretty a, Pretty (tree a)) => Pretty (Node23 tree a)
> > > where ...
> >
> > The class Pretty is from Daan Leijen's pprint library.
> >
> > I think that the 'non-type variable' refered to above is the
> > application (tree a) in the constraint (Pretty (tree a)), which is
> > arguably "almost" a type variable. In this case I think it is even
> > more obvious that it can't cause a loop, since the LHS clearly has
> > a type constructor removed, right?
> >
> > I mention this mainly because my module is otherwise completely H98
> > and I thought it would be nice to keep it that way. I need the
> > Pretty instance for debugging only, so it's not really a
> > show-stopper. Still I wonder if somebody knows a work-around that
> > doesn't need a language extension (some newtype trick, maybe?).
>
> I believe the "correct" way to do this is with a Pretty-promoting
> constructor class.
>
>
>     class Pretty'1 f where
>         pretty'1 :: Pretty a => f a -> Doc
>         prettyList'1 :: Pretty a => [f a] -> Doc
>
>     instance (Pretty a, Pretty'1 tree) => Pretty (Node23 tree a)
> where ...
>
> Your typical Pretty'1 instance will look like this:
>
>     instance Pretty'1 T where
>         pretty'1 = pretty
>         prettyList'1 = prettyList

Works like a charm. Thanks a lot!

Ben


More information about the Haskell mailing list