[ghc-steering-committee] a plea against ScopedTypeVariables

Richard Eisenberg rae at richarde.dev
Thu Dec 3 16:48:17 UTC 2020

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.


More information about the ghc-steering-committee mailing list