Type class instances in scope
Tom Sydney Kerckhove
syd.kerckhove at gmail.com
Fri May 19 09:05:17 UTC 2017
On 18-05-17 20:41:13, Edward Z. Yang wrote:
> Hi Tom,
Hi Edward,
> The problem is that GHC lazily loads non-orphan instances, so they won't
> be in the environment until you load the interface which would have
> caused the instance to come into scope.
Oh, that's annoying.
I have a feeling there is room for an optimisation here.
... or maybe this was already an optimisation, I don't really know.
> I'm not sure exactly what you are actually trying to do.
More concretely, I need to generate a line of code for every 'Arbitrary'
instance in scope.
Later I'll also need to use other instances but this is the first part.
> But if you
> really need all instances, you will have to first arrange to load
> the interfaces of ALL modules transitively imported by your module.
I don't really mind the time it takes to do this, but that's annoying to
write.
Thank you for your help! I will look into it.
> Edward
>
> Excerpts from Tom Sydney Kerckhove's message of 2017-05-18 14:39:38 +0200:
> > Dear GHC Devs.
> >
> > I am trying to use the GHC API as part of the work that I am doing for
> > my thesis. Currently I am looking for a way to find all the type class
> > instances that are in scope in a given module.
> >
> > Here's what I've tried:
> >
> > ```
> > getInstancesFromTcmodule
> > :: GhcMonad m
> > => TypecheckedModule -> m ()
> > getInstancesFromTcmodule tmod = do
> > let (tcenv, md) = tm_internals_ tmod
> > let insts = tcg_insts tcenv
> > getInsts >>= printO
> > printO $ modInfoInstances $ tm_checked_module_info tmod
> > printO insts
> > printO $ md_insts md
> > printO $ tcg_inst_env tcenv
> >
> > printO
> > :: (GhcMonad m, Outputable a)
> > => a -> m ()
> > printO a = showGHC a >>= (liftIO . putStrLn)
> > ```
> >
> > Unfortunately the output that I get is empty:
> >
> > ```
> > ([], [])
> > []
> > []
> > []
> > []
> > ```
> >
> > For the record, I ran this on the following module:
> >
> > ```
> > {-# LANGUAGE NoImplicitPrelude #-}
> > module Ints where
> >
> > import Prelude (Int, (+), (-))
> >
> > f :: Int -> Int
> > f x = x + 1
> >
> > g :: Int -> Int
> > g x = x - 1
> >
> > double :: Int -> Int
> > double x = x + x
> >
> > zero :: Int
> > zero = 0
> > ```
> >
> > Because I'm using '+' and '-', I definitely expect the instances of
> > 'Num' to be available, but I am also expecting to find ALL the other
> > instances that are available for type checking.
> >
> > Is there any documentation on this matter?
> > Failing that, is there anyone who is willing to help me with this
> > problem?
> >
> > Thank you for your time.
> >
--
Tom Sydney Kerckhove
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20170519/2bec207f/attachment-0001.sig>
More information about the ghc-devs
mailing list