Problem with lexically scoped type variables.

Simon Peyton-Jones simonpj at
Mon Oct 2 10:28:14 EDT 2006

| Simon Peyton-Jones asks for programs that are broken by the proposed
| change. Here is a nearly real world one:

You may not like this but this should work:

Instead of

| t1 = runST (trav f [1..10] (1,52) >>= \ (s::STRef s (Set Int)) -> seen


t1 = runST ( (trav f [1..10] (1,52) >>= \ s -> seen s)
		:: forall s. ST s [Int] )

or, equivalently

t1 = runST run_it
    run_it :: forall s. ST s Int
    run_it = trav f [1..10] (1,52) >>= \s -> seen s

What's interesting about this example is that you aren't trying to bind
the type variable 's'.  You'd be quite happy to write
	\ (s :: STRef _ (Set Int)) -> seen s

Note the wildcard "_".  Arguably, one could loosen the rules in this
case.  This is an avenue that I have seen suggested before, but which I
have, for one, not yet explored.   Maybe others have better ideas.


More information about the Glasgow-haskell-users mailing list