Visible forall: 3-Year Anniversary

Dear GHC Steering Committee, Today (10 Oct, 2021) marks three years since the pull request for the #281 “Visible forall” proposal was opened. https://github.com/ghc-proposals/ghc-proposals/pull/281 There has been a lot of discussion, which led to numerous refinements and improvements to the proposal text and its content. When the initial version of the proposal was written, it wasn’t clear if this feature would be a good addition to Haskell. But now that #378 “Design for dependent types” has been accepted, the job of #281 “Visible forall” is merely to elaborate the details of a design that we already agreed on. Because of its reduced scope, I hope there won’t be a 4th anniversary. So I invite everyone to take a look at the current iteration of the proposal and vote on it. The proposal text is at: https://github.com/int-index/ghc-proposals/blob/visible-forall/proposals/000... - Vlad

Oh no. It seems I made the best kind of error – an off-by-one error. It’s only the 2-Year Anniversary! This is, of course, good news, as it means the process is 1.5 times faster than I assumed. The call to action stays the same: let’s move forward with the proposal. - Vlad
On 10 Oct 2021, at 23:36, Vladislav Zavialov (int-index)
wrote: Dear GHC Steering Committee,
Today (10 Oct, 2021) marks three years since the pull request for the #281 “Visible forall” proposal was opened.
https://github.com/ghc-proposals/ghc-proposals/pull/281
There has been a lot of discussion, which led to numerous refinements and improvements to the proposal text and its content.
When the initial version of the proposal was written, it wasn’t clear if this feature would be a good addition to Haskell. But now that #378 “Design for dependent types” has been accepted, the job of #281 “Visible forall” is merely to elaborate the details of a design that we already agreed on.
Because of its reduced scope, I hope there won’t be a 4th anniversary. So I invite everyone to take a look at the current iteration of the proposal and vote on it.
The proposal text is at: https://github.com/int-index/ghc-proposals/blob/visible-forall/proposals/000...
- Vlad

Hi, thanks for pushing us here again. Fundamentally in favor. For those of you who are not following Github, Vlad and I are disagreeing over how breaking the change can be. The proposal as it stands makes forall a keyword in terms – irrespective of any extensions that are on. Vlad argues that this is good: Code that uses forall as an identifier should change that as soon as possible. Also, it simplifies the implementation of the lexer and parser if the keywordhood of `forall` doesn't depend on extensions. I argue that this is too inconsiderate towards our users. While I am generally not hesitant to require _code changes_, possibly even with CPP, when people enable new extensions, or sometimes even when upgrading the compiler, this case seems to be qualitatively more severe: Library who _export_ an identifier called `forall` (which a few “real world” libraries do; HaTeX, sbv, what4 and many others) would find themselves unable to support a newer compiler without a _breaking_ change to their public API. I find that quite a big hammer, and I am not sure if we had precedent for that before, nor that we want to set that precedent. And it seems possible to have a milder migration strategy: * Introduce -XForallInTerms * It’s implied by new extensions like -XRequiredTypeArguments * It becomes the default with next GHC20xx (but not with Haskell2021) * -XNoForallInTerm (and the kludges necessary to support that) stay around for a while (NB: One can _use_ qualified names that happen to be keywords just fine; if a module M exports class, M.class works. So users of such old APIs can use HaTeX.forall even if they have opted into the new world.) I think we’ve exchanged the arguments, so now it remains a judgement call between more nudging, simpler GHC and a less complex set of extensions on the one hand vs. not forcing developers to break their library APIs in order to use new GHC versions. What do the others think? Cheers, Joachim -- Joachim Breitner mail@joachim-breitner.de http://www.joachim-breitner.de/

Hi,
As a general rule, I would prefer *not* introducing breaking changes.
People already complain how much breakage is in the Haskell ecosystem in
general, and we should try not to be part of the problem too.
Alejandro
El 13 oct 2021 13:16:39, Joachim Breitner
Hi,
thanks for pushing us here again. Fundamentally in favor.
For those of you who are not following Github, Vlad and I are disagreeing over how breaking the change can be. The proposal as it stands makes forall a keyword in terms – irrespective of any extensions that are on.
Vlad argues that this is good: Code that uses forall as an identifier should change that as soon as possible. Also, it simplifies the implementation of the lexer and parser if the keywordhood of `forall` doesn't depend on extensions.
I argue that this is too inconsiderate towards our users. While I am generally not hesitant to require _code changes_, possibly even with CPP, when people enable new extensions, or sometimes even when upgrading the compiler, this case seems to be qualitatively more severe: Library who _export_ an identifier called `forall` (which a few “real world” libraries do; HaTeX, sbv, what4 and many others) would find themselves unable to support a newer compiler without a _breaking_ change to their public API. I find that quite a big hammer, and I am not sure if we had precedent for that before, nor that we want to set that precedent.
And it seems possible to have a milder migration strategy: * Introduce -XForallInTerms * It’s implied by new extensions like -XRequiredTypeArguments * It becomes the default with next GHC20xx (but not with Haskell2021) * -XNoForallInTerm (and the kludges necessary to support that) stay around for a while (NB: One can _use_ qualified names that happen to be keywords just fine; if a module M exports class, M.class works. So users of such old APIs can use HaTeX.forall even if they have opted into the new world.)
I think we’ve exchanged the arguments, so now it remains a judgement call between more nudging, simpler GHC and a less complex set of extensions on the one hand vs. not forcing developers to break their library APIs in order to use new GHC versions.
What do the others think?
Cheers, Joachim
-- Joachim Breitner mail@joachim-breitner.de http://www.joachim-breitner.de/
_______________________________________________ ghc-steering-committee mailing list ghc-steering-committee@haskell.org https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee
participants (3)
-
Alejandro Serrano Mena
-
Joachim Breitner
-
Vladislav Zavialov (int-index)