After a bit more thought, I am not sure what do we get with this notation over ScopedTypeVariables. In particular, here are some things that came up as I was trying to write a couple of examples:
1. The order in which variables are introduced is not clear---presumably it is some sort of left to write ordering based on the type signature. For example:
f1 :: (a,b) -> a -- first type param is `a`?
f2 :: Ord b => a -> b -> a -- first type param is `b`?
type T a b = (b,a)
f3 :: T a b -> a -- first type param is?
This approach seems quite fragile.
2. The proposal says that a problem with the `forall` in ScopedTypeVariables is that the signature can be arbitrarily far away from the implementation. I agree that this is a problem, but it seems to remain a problem with this proposal, as you have to look at the signature to see in what order you should write the parameters.
3. There are some things that you can write with the `forall` notation, that you cannot write using this notation. For example:
f3 :: forall a. Bool
f3 = null ([] :: [a])
Clearly this example is a bit contrived, but still it illustrates a problem.
As is, I am not sure what we are getting over ScopedTypeVariables. Am I missing something here?
-Iavor