Time for a little historical context
3.7 Haskell and Haskell 98
The goal of using Haskell for research demands evolution, while using the language for teaching and applications requires stability. At the beginning, the emphasis was firmly on evolution. The preface of every version of the Haskell Report states: “The committee hopes that Haskell can serve as a basis for future research in language design. We hope that extensions or variants of the language may appear, incorporating experimental features.”
However, as Haskell started to become popular, we started to get complaints about changes in the language, and questions about what our plans were. “I want to write a book about Haskell, but I can’t do that if the language keeps changing” is a typical, and fully justified, example.
Many of the criticisms leveled at this change seem to belong in this category: “I can’t teach/use Haskell with confidence if it’s constantly changing …” - however:
We made no attempt to discourage variants of Haskell other than Haskell 98; on the contrary, we explicitly encouraged the further development of the language. The nomenclature encourages the idea that “Haskell 98” is a stable variant of the language, while its free-spirited children are free to term themselves “Haskell.”
So by this observation:
- that
(/=)
was a method of Eq
on 2021-11-11
- then was just another function on 2021-11-12
means Haskell [sans version] is proceeding generally as expected:
the Haskell community […] usually not only absorbs language changes but positively welcomes them: it’s like throwing red meat to hyenas.
…but judging by a few of the comments here, some of those hyenas are now begging for Alka-Seltzer(R). There was an attempt to bring some order to this chaos by providing another stable version of the language:
https://mail.haskell.org/pipermail/haskell-prime/2016-April/004050.html
which eventually went nowhere:
https://reasonablypolymorphic.com/blog/haskell202x
…and here we all are today, trying in our own ways to find the balance between evolution and stability. Here’s an idea: let’s call the language & version supported by e.g. GHC v. 9.2.2 “Haskell 1.9.2.2”, based on the following observation:
- early versions of Haskell: v. 1.0 to 1.4
- Haskell 98: v. 1.5
- Haskell 98 with addenda: v. 1.52
- Haskell 2010: v 1.6
-
Haskell 2010 with GHC-isms: v. 1.7.0.1
…and so forth (I’m conveniently ignoring the advent of “Dependent Haskell”: maybe a whole new language, like how Raku appeared? :-). If it’s possible, doing this officially could help to ease the tension between stability and evolution:
-
Academics (and perhaps builders of alternate Haskell implementations) can choose the specific version of Haskell that interests them;
-
The removers of “warts and moles” from Haskell don’t have to wait [indefinitely?] for e.g. “Haskell 2024” to have those changes accepted: they just need to increment the current Haskell version and update the Haskell Report accordingly, along with any other pertinent documentation.
One other possible benefit:
- Updating said documentation can also be made a requirement for adding new language features.
Of course, you still can add or remove all the features you like to your own private copy of GHC, but your changes will only be given any serious consideration if you’ve documented it well (e.g. as a draft revision of official documentation). Not only does this focus the attention of those proposing potentially-breaking changes, it could allow more of them to be aggregated together in each new Haskell version - occasional large changes instead of frequent small ones.
Alternately, just adopt the useful parts of the approach the Rust language relies on to strike it’s balance between stability and evolution, and adapt them according.
But all this talk of decisions in hindsight regarding head
and tail
being in the Haskell prelude or (/=)
being a method of Eq
may be missing the point - in hindsight (again!), perhaps the better decision was for the original Haskell committee to design two non-strict functional languages instead of one:
-
a “concept language” intended for evolution, which charges ahead with new concepts and ideas;
-
a “production language” intended for stability, which follows behind cautiously at a safe distance and picking up only the most enduring and useful of features.