> On Oct 27, 2021, at 9:54 AM, Benjamin Redelings 
> <benjamin.redeli...@gmail.com> wrote:
> 
> Hi,
> 
>     I have been looking for info on what actually comes out of the 
> type-checking pass in GHC.  This is mostly because it seems like the "Type 
> classes in Haskell" paper implements both type checking and translation to 
> dictionary-passing in one pass, whereas it seems like GHC separates this into 
> (i) type checking and (ii) desugaring.

This is correct: GHC takes two different passes to do this work. The big reason 
is around error messages: we want to have the code that the user wrote when 
reporting error messages. Since errors arise during type-checking, we thus want 
the output of the type checker to look like what the user wrote.

> 
> Questions:
> 
> 1. It seems like this separation is actually necessary, in order to apply 
> generalization only to let arguments written by the programmer, and not to 
> let bindings introduced during desugaring. Is that right?

I don't think so. That is, if we did it all in one pass, I still think we could 
get generalization right.

> 
> 2. Does the output of type checking contain type lambdas?

Yes. See below.

> 
> 3. Does the type checking pass determine where to add dictionary arguments?

Yes. See below.

> 
> 4. Are there any other resources I should be looking at?

Yes. You want to enable -fprint-typechecker-elaboration (and possible 
-fprint-explicit-coercions). With the former, you get to see all this stuff 
you're looking for. It's normally suppressed so that the output resembles the 
user's code.

I hope this helps!
Richard
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to