GHC source code improvement ideas

Twan van Laarhoven twanvl at gmail.com
Thu Jan 3 21:22:52 EST 2008


Hello GHC people,

I was trying my hand at some GHC hacking, and I couldn't help but notice 
that much of the code looks (IMHO) horrible. There are some things that look 
as if they haven't been touched since the Haskell 1.3 days. The most 
striking is the use of `thenXX` instead of do notation.

I was thinking of cleaning up some of this. In particular:

  1a. Use do notation where possible instead of `thenXX`.

  1b. Even better, use Applicative where possible. For example

         ds_type (HsFunTy ty1 ty2)
           = dsHsType ty1			`thenM` \ tau_ty1 ->
             dsHsType ty2			`thenM` \ tau_ty2 ->
             returnM (mkFunTy tau_ty1 tau_ty2)

      Could be rewritten as

         ds_type (HsFunTy ty1 ty2)
           = mkFunTy <$> dsHsType ty1 <*> dsHsType ty2

  2. Investigate the need for all these mappM functions. To quote the 
source: "Standard combinators, but specialised for this monad (for 
efficiency)". Wouldn't a SPECIALIZE pragma work just as well?

  3. In general, use standard functions when they are available. Currently 
GHC has its own sort function and its own versions of FiniteMap/Data.Map and 
Text.PrettyPrint. Using standard functions/data structures will a) make GHC 
smaller and therefore easier to maintain, and b) will make the code easier 
to understand for someone who knows the standard library.

  4. A more radical change would be introducing hierarchical modules. This 
could be just a matter of renaming the directories to start with an upper 
case character and changing the import declarations. This gives module names 
like "Typecheck.TcGadt". The tc is redundant here, so perhaps it should be 
renamed to "Typecheck.Gadt" or "Typecheck.GADT". Perhaps even better would 
be "GHC.Typecheck.GADT", this way some modules can be exposed as part of the 
GHC api.


How do the GHC developers feel about this? Would such paches be gladly 
excepted? Or will they be directly forwarded to the bit bucket?

Twan


More information about the Glasgow-haskell-users mailing list