
The original runST implementation (i.e., hardwire it into the typechecker) really is pretty simple. I think even I could do it (to Hugs).
Well there's a recommendation indeed. Perhaps I'll take a look.
instance Bits Integer
1) Transform the Integer arguments into infinite streams of bits (sign extending as necessary)
Are these streams chunked into words, or are they of uneven lengths? Wait, that's a dumb question. Of course conceptually they can be of any length, but in practice they can be implemented any way you like that preserves the semantics, yes? Ok, I think I understand now.
As a point of interest, is there a good reason why the Exception type needs to be in the Prelude?
because you want to define error by something like: error msg = Exception.raise (Exception.Error msg)
I'm still not entirely sure I understand why a qualified import into the Prelude implementation (as you have illustrated here) is not sufficient. Does Exception need to be hardwired into the Prelude? For a comparable example, think of type Prelude.Rational which is defined as (Ratio.Ratio Prelude.Integer). The Ratio type is not in the prelude, just used by it.
NHC vs Nhc
Is NHC/Nhc (used as) an acronym?
No, it has never stood for anything in particular. Or only light-heartedly. Regards, Malcolm