| Ok thanks.  It would also be nice to allow forall in instance
| declarations so that the following would be possible.
| 
| import ST
| 
| class Run s c where
|     run :: s c -> c
| 
| instance Run (forall s. ST s) c where
|     run a = runST a

First of all, the scoping here is wrong.  This example is nonsense
because  (forall s. ST s) c  isn't the same as  (forall s. ST s c).

Secondly, this example puts forall's into a completely new context,
and I'm not sure we know how to make unification work when with
such types.  That, after all, is why we have to give forall's a
special case treatment to begin with.  Much better, it seems to
me, to write:

  newtype Runnable a = Runnable (forall s. ST s a)

and then define:

  instance Run Runnable a where run (Runnable p) = runST p

I'm not sure you even want a two parameter class for Run here.

Mark

Reply via email to