[Haskell-cafe] Re: how would this be done? type classes? existentialtypes?

Ben Rudiak-Gould Benjamin.Rudiak-Gould at cl.cam.ac.uk
Fri Mar 17 11:53:42 EST 2006

Matthias Fischmann wrote:
> is there any difference between these
> two?  if they are equivalent, why the two different ways to say it?
>   data X where X :: (Resource a) => a -> X
>   data Y = forall a . (Resource a) => Y a

There's no difference. There are two ways to say it for historical reasons. 
The second notation dates back many years, while the first notation is new 
and experimental. Only the first notation supports GADTs, and only the 
second supports deriving declarations and strict fields and record syntax 
(though I think this is going to change). Also the second notation is more 
convenient when you're declaring an ordinary datatype---compare

     data List a = Nil | Cons a (List a)
     data List a where { Nil :: List a ; Cons :: a -> List a -> List a }

> and now it gets interesting: i need instances for Rs on Show, Read,
> Eq, Ord.  Show is very simple, but Read?

I think you're right: it's impossible to implement Read for Rs in an 
extensible way, because there's no way to obtain the necessary Resource 
dictionary at runtime. I've wished in the past for a family of functions, 
one for each single-parameter typeclass, with types something like

     Dynamic -> (forall a. C a => a -> b) -> Maybe b

and you'd need something similar here.

Assuming this is indeed impossible and you have to close the world of 
Resources, you may as well do it by writing

     data Rs = RsRice Rice | RsCrudeOil CrudeOil | ...
       deriving (Show,Read,Eq,Ord)

-- Ben

More information about the Haskell-Cafe mailing list