| 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
s)

try

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

or, equivalently

t1 = runST run_it
  where
    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.

Simon
_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to