GHC source code improvement ideas

Neil Mitchell ndmitchell at
Fri Jan 4 09:07:51 EST 2008


Yhc did a few of these things, and our experiences were:

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

If it is that simple, yes. Certainly Yhc uses "super-monads" which
made this a bit painful. You should probably step this by getting it
to the stage where thenXX = >>=, then only flipping to do notation
once the things are already monads.

>   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

I still don't particularly like applicative, it is a bit confusing to
me. If you moved to using the Uniplate library, you could then write:

descendM dsHsType

Shoter, more concise, and probably works for more cases than just
HsFunTy - eliminating even more code. I suspect moving to Uniplate
would give GHC massive benefits.

>   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.

We did this in Yhc, and it was really useful just to group files into
the same directory.



More information about the Glasgow-haskell-users mailing list