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
signature.asc
Description: PGP signature
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs