Accessing dictionaries from a GHC plugin

Yannick Boesmans yannick.boesmans at gmail.com
Fri Apr 22 10:58:45 UTC 2016


Hi,

I'm trying to develop a GHC plugin to transform effect handlers for free
monads. I have created my own module with the free monad definitions. The
goal is that if a user uses these definitions, my plugin will rewrite the
handlers into a form which will allow fusion.


For a first simple example I'm trying to transform the following code:

handleNondet :: Functor g => Free (Nondet + g) a -> Free g [a]
handleNondet = \y -> case y of
    Var x -> Var [x]
    Con op -> case op of
        Inl x -> case x of
            Or l r -> (handleNondet l >>= (\ll -> handleNondet r >>= (\rr
-> Var (ll ++ rr))))
        Inr x -> Con (fmap handleNondet x)


into this:

handleNondet :: Functor g => Free (Nondet + g) a -> Free g [a]
handleNondet = foldFree genNondet algNondet

genNondet :: Functor g => a -> Free g [a]
genNondet x = Var [x]

algNondet :: Functor g => (Nondet + g) (Free g [a]) -> Free g [a]
algNondet op = case op of
    Inl x -> case x of
        Or l r -> (l >>= (\ll -> r >>= (\rr -> Var (ll ++ rr))))
    Inr x -> Con x

-----------------------------------------------------------------------------------------------------------------------------------

In my module with definitions, Free, Con, Var, the (+), Inl and Inr are
defined and the foldFree function is defined.
There is also a functor instance:    instance (Functor f, Functor g) =>
Functor (f + g)


The problem is that when trying to do this transformation in GHC Core, I
only get a dictionary for the functor g, but not for Nondet or for
(Nondet + g).
What is need is of the form:
(WhatMorphism.Free.$fFunctor+
                @ Nondet @ g_a2MS Types.$fFunctorNondet $dFunctor_a2R9)

and I have access to @ Nondet, @ g_a2MS and $dFunctor_a2R9, but I don't
know how to find WhatMorphism.Free.$fFunctor+ and Types.$fFunctorNondet.

I am trying to find out whether it is possible to find these dictionaries
from a GHC Core plugin, or whether this has to happen in an earlier stage
of the compilation. If it is possible, how would I go about it? And if it
is not, where should I start looking to implement this functionality anyway?

Regards,
Yannick Boesmans
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20160422/2c2255b6/attachment.html>


More information about the ghc-devs mailing list