
On 7/20/05, John Goerzen
There was a brief discussion on #haskell today about the Haskell standard. I'd like to get opinions from more people, and ask if there is any effort being done in this direction presently.
I think an updated standard is overdue. I find it difficult anymore to write any but the most trivial of programs using pure Haskell 98. Some notable, and widely-used, features developed since then include:
* Overlapping instances * FFI * Hierarchical namespace * Undecidable instances
Even if "undecidable instances" was standardized, would we want it turned on by default? I am trying to write "real" programs in Haskell and I have never even comtemplated using undecidable instances. My understanding is that they can be unintuitve, and they can cause typechecking to fail to halt. So, it seems reasonable to require that undecidable instances require some kind of option to be present. Thus, there would be a standard "undecidable instances" option or pragma. Now, it seems reasonable that, if we can standardize the option for undecidable instances, we could do the same thing for all new features we wish to add to Haskell 2. This is basically what the Cabal {-# LANGUAGE UndecidableInstances CPP PatternGuards ... #-} pragma does. Each implementation would have a set of pragmas that it supports. It would be best if the implementors agree on a specification for each feature, so that, e.g. "-# LANGUAGE UndecidableInstances #-} works identically wherever it is supported. Eventually, we would all look around at each other and realize "hey, GHC, Hugs, and NHC all support pragmas A, B, C, ... and these pragmas are so useful they should be available by default" Then, we could make a new option: {-# LANGUAGE Haskell 2005 #-} This would be equivalent to {-# LANGUAGE A B C ... #-}. Then, we would say that, if {-# LANGUAGE Haskell x #-} is omitted, then x defaults to "98." Note that this works for deletions too {-# LANGUAGE No<DeletedFeature> #-}. I imagine something similar would work for libraries: every implementation would build up a set of libraries its supports by default. We would recognize the common set of packages supported and say "this set of packages is the Haskell 2005 standard library." The bad thing about this is that "Hellow World, Haskell 2005" would become kind of ugly: {-# LANGUAGE Haskell 2005 #-} main = putStrLn "Hello, World!" But, of course, Haskell 2005 would be backwards compatible enough to support the 98 version: main = putStrLn "Hello, World!" I guess there must be some reason that this scheme is really horrible because I don't know of any language that has ever done things this way. But, it seems to make sense to me... - Brian