[Haskell-cafe] Data structure containing elements which are instances of the same type class

oleg at okmij.org oleg at okmij.org
Sat Aug 11 10:14:47 CEST 2012

> data A = A deriving Show
> data B = B deriving Show
> data C = C deriving Show
> data Foo = forall a. Show a => MkFoo a (Int -> Bool)
> instance Show Foo where
>    show (MkFoo a f) = show a

I'd like to point out that the only operation we can do on the first
argument of MkFoo is to show to it. This is all we can ever do:
we have no idea of its type but we know we can show it and get a
String. Why not to apply show to start with (it won't be evaluated
until required anyway)? Therefore, the data type Foo above is in all
respects equivalent to

> data Foo = MkFoo String (Int -> Bool)

and no existentials are ever needed. The following article explains
elimination of existentials in more detail, touching upon the original
problem, of bringing different types into union.


More information about the Haskell-Cafe mailing list