[ghc-steering-committee] a plea against ScopedTypeVariables

Eric Seidel eric at seidel.io
Thu Dec 3 20:16:51 UTC 2020

Although I have not yet submitted my votes yet, I do plan to vote for
including ScopedTypeVariables, even though I also have some issues
with it. Richard complains that `forall` brings type variables into scope
at the term-level; I'm annoyed that I have to write the `forall` in the
first place, I'd prefer to have all type variables brought into scope.

But these quibbles don't matter. ScopedTypeVariables is a supremely
useful extension even in its current state, and we should enable it.
If we come up with a different, better design for ScopedTypeVariables
in the future, we can

1. give it a new name
2. in GHC202X replace ScopedTypeVariables with the new extension
3. (slowly) deprecate ScopedTypeVariables

Note that step 2 is non-breaking because people have to opt into
the new language standard, so it actually makes these kinds of
changes easier. That's one of the major draws of the GHC20XX

On Thu, Dec 3, 2020, at 15:06, Alejandro Serrano Mena wrote:
> Whereas I agree that ScopedTypeVariables may not be ideal in its 
> current incarnation, I think we should include this one for a few 
> reasons.
> * It's used a lot, in fact it's one of the most popular extensions in 
> the survey, while still being not that contentious. I think almost 
> everybody enables it liberally.
> * It doesn't do harm unless you add the explicit 'forall' in the type 
> signatures.
> * Right now, there's no other way to bring type variables into scope! 
> It would be really weird if GHC2021 would have TypeApplications, but I 
> need to enable an extension to refer to variables in scope.
> El jue, 3 dic 2020 a las 17:48, Richard Eisenberg (<rae at richarde.dev>) escribió:
> > Hi all,
> > 
> > I'd like to make a small plea against ScopedTypeVariables.
> > 
> > * First off, I love (most of) ScopedTypeVariables, and enable it liberally. It is a safe extension.
> > 
> > * But I very much dislike the way it brings variables into scope from `forall`s. When I write
> > 
> > > f :: forall a. a -> a
> > > f x = (x :: a)
> > 
> > I find it very odd that `a` is brought into scope in the body of f. Compare to
> > 
> > > f :: (forall a. a -> a)
> > > f x = (x :: a)
> > 
> > where I have added parentheses to the type of f. Now `a` is not in scope in the body of f. That's bizarre.
> > 
> > * Note that type signatures and function definitions can be arbitrarily separated in a file. Some programmers indeed prefer to do this, so that type signatures can all be in one place, forming an interface to the file. (I've even seen header files, included via CPP!) I'm not necessarily advocating for that style, but I can't quite say it's absurd. Our ML friends do this reflexively.
> > 
> > * I'm hoping ScopedTypeVariables will lose this feature in the future. I've been meaning to propose such for some time. See https://github.com/ghc-proposals/ghc-proposals/pull/238#issuecomment-499572523, which re-slices this cake.
> > 
> > Thus, given the potential for change in the future, and some drawbacks of the extension as it currently stands, I think we should not enable it by default, making change harder in the future.
> > 
> > Thanks,
> > Richard
> > _______________________________________________
> > ghc-steering-committee mailing list
> > ghc-steering-committee at haskell.org
> > https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee
> _______________________________________________
> ghc-steering-committee mailing list
> ghc-steering-committee at haskell.org
> https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee

More information about the ghc-steering-committee mailing list