Finding & assembling class dictionaries from GHC plugins?

Simon Peyton-Jones simonpj at
Wed Nov 6 13:59:15 UTC 2013

Hmm. One route would be to build a HsExpr (rather than a CoreExpr) for the reification of your CoreExpr, and stick that into the maw of the type checker.  That would hand off all this dictionary construction to the type checker, which is designed for the purpose.


From: conal.elliott at [mailto:conal.elliott at] On Behalf Of Conal Elliott
Sent: 05 November 2013 23:41
To: Simon Peyton-Jones
Cc: Nicolas Frisby; ghc-devs at
Subject: Re: Finding & assembling class dictionaries from GHC plugins?

Hi Simon,

Here's some context on what I'm after. I'll try to include enough to clarify what I'm after, without dragging you into unnecessary detail.

I have a Core expression, which I'm systematically translating to a related Core expression. The second one reifies the first one, so that the generated code *evaluates* to a run-time (not compile/Core-time) representation akin to the original Core expression. In this second (reified) representation, I need some run-time representation of types. I use Typeable constraints in my representation, and these constraints don't appear in the original Core representation. For instance, I have the following constructor for function application in a GADT of lambda expressions:

> (:^) :: (Typeable a, Typeable b) => E (a -> b) -> E a -> E b

My reification plugin takes a Core application expression, recursively reifies the function and argument expressions, and makes an expression that applies (:^) to the two recursive results. However--and the point of this thread--I also need to come up with Core expressions for the two Typeable dictionaries.

So, to clarify my request, given a Core type representation t, I want to construct a Core expression that evaluates to the dictionary for Typeable t if one exists, or fail if there isn't one. Note that t is not necessarily an atomic type; it could instead be something like [(Bool,Int -> String)].
I'm happy to Skype-chat if it'd help.
Thanks,  - Conal

On Tue, Nov 5, 2013 at 2:37 PM, Simon Peyton-Jones <simonpj at<mailto:simonpj at>> wrote:

We just don't know how to start - ie how call the right functions from the type checker. Are there any resources explaining the relevant subset of the TcRnIf API?
And I for my part don't know where to start helping you!  Conal wrote

I don't think I need to construct dictionaries for new Typeable instances. I only need to find and assemble *existing* Typeable instances into combinations like Typeable [(Bool,Int -> String)], and I don't know how to do so in a GHC plug-in

That's exactly what the constraint solver does.  (TcSimplify and friends.)  But again I need more context.

I gather you are talking to Pedro too?  He knows a lot about this stuff.

Also there are a bunch of folk (Luite, Edsko) worked on the new front-end plugin stuff, and are much more expert in it than me.

We could have a skype call if that would help


From: Nicolas Frisby [mailto:nicolas.frisby at<mailto:nicolas.frisby at>]
Sent: 05 November 2013 14:36
To: Simon Peyton-Jones
Cc: ghc-devs at<mailto:ghc-devs at>; Conal Elliott
Subject: RE: Finding & assembling class dictionaries from GHC plugins?

On Nov 5, 2013 3:14 AM, "Simon Peyton-Jones" <simonpj at<mailto:simonpj at>> wrote:

> A core-level plug-in can't generate fresh instances.  There are some new plug-in hooks that fit earlier in the pipeline, which can.  Maybe you can use that, and generate a data type decl with "deriving Typeable"?

We're willing to do some awkward shoehorning in HERMIT to make this work in limited circumstances. (Hopefully including Conal's.)

We just don't know how to start - ie how call the right functions from the type checker. Are there any resources explaining the relevant subset of the TcRnIf API?


> From: ghc-devs [mailto:ghc-devs-bounces at<mailto:ghc-devs-bounces at>] On Behalf Of Conal Elliott
> Sent: 04 November 2013 20:08
> To: ghc-devs at<mailto:ghc-devs at>
> Subject: Finding & assembling class dictionaries from GHC plugins?
> I'm working on a GHC plugin (for compiling Haskell to hardware), and I need to synthesize Typeable (and maybe other) class dictionaries for a wide range of types, including composite types (functions, pairs, lists, etc). Can it be done, and how? I think I'm mainly looking for mechanics of finding existing class instances (however they're defined) and assembling them (for parametrized/composite dictionaries), rather than mechanisms specific to Typeable.
> Thanks, -- Conal
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at<mailto:ghc-devs at>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the ghc-devs mailing list