[Haskell-cafe] Retrieving information about type families

Richard Eisenberg eir at cis.upenn.edu
Sun Jul 27 14:01:16 UTC 2014


Ah, yes, that is a harder nut to crack. You would need to bring the type variables in type patterns into scope before typechecking. See the code for tc_fam_ty_pats in TcTyClsDecls for how this is done normally, but it's rather involved.

As for querying existing structures, you may have a hard time. The problem is that types are handled differently from terms. Terms are typechecked and converted from HsExpr Name to HsExpr Id. The HsExpr Id has been typechecked and thus has stable type information. But, because it's a variant of HsExpr, it still has location information. HsExpr Id is then desugared into CoreExpr, which has no location information.

Types, on the other hand, are checked and desugared simultaneously. This is necessary because typechecking needs to be able to compare types, and we wouldn't want to try to compare HsTypes for equality. So, instead of going through an HsType Id formation, the typechecker goes straight from HsType Name to Type (the Core type type). `Type`, of course, has no location information. So, you won't be able to query by location.

But, I just thought of a way out: type family instances are compiled into CoAxioms, which *do* store location information. The list of CoAxioms should be available from the ModuleInfo via modInfoTyThings. Or, you can get a CoAxiom out of a FamInst if you have that handy. An open type family instance's CoAxiom will have one branch. Then, you can look at the tyvars (cab_tvs) and types (cab_lhs) to triangulate to the bit that you want. It's quite possible that the `Name`s of the tyvars have the location you're looking for. Be careful, because the list of tyvars includes kind variables here, which are omitted in the source. isKindVar should be helpful in filtering these out.

I hope this helps!
Richard

On Jul 26, 2014, at 4:57 AM, Alejandro Serrano Mena <trupill at gmail.com> wrote:

> I'm still struggling with getting the right information. My aim is to know the kind of a specific variable in a type instance defintion. For example, if I get:
> 
> type family F (x :: Bool)
> type instance F y = ()
>                 ^
> 
> where ^ marks the point from where I want the information, I want to get "y has kind Bool". 
> 
> The approach I'm taking is obtaining the LHsType Name from the specific position in the RenamedSource of the file. Then, I'm trying to convert that LHsType Name to a Type using functions in HscTypes, but I always get complaints about not existing variables.
> 
> In the past, I implemented something similar for normal functions. However, in that case I could get the information directly from TypecheckedSource, by querying for a pattern variable with the right location. However, in the TypecheckedSource there's no information about type families at all :( My other possibility seems to use the ModuleInfo, but in those places there's no information of location :(
> 
> Is there any way to achieve what I'm trying to do (get the kind of a specific type variable in the LHS of a type family instance, where the variable is given by its position in the source code)?
> 
> Thanks in advance.
> 
> 
> 2014-07-25 18:12 GMT+02:00 Alejandro Serrano Mena <trupill at gmail.com>:
> Thanks for the help! At the end I'm trying to get the information from a RenamedSource (so I can still get source locations) and then get type information using TcHsType. I haven't succedeed yet, but I think I'm on the way!
> 
> 
> 2014-07-23 23:38 GMT+02:00 Richard Eisenberg <eir at cis.upenn.edu>:
> 
> Does FamInstEnv.lookupFamInstEnv work for you? You will also probably want FamInst.tcGetFamInstEnvs.
> 
> Richard
> 
> On Jul 23, 2014, at 2:48 PM, Alejandro Serrano Mena <trupill at gmail.com> wrote:
> 
> > Dear Café,
> > My quest for obtaining information about type families continues.
> > Now I have a simple question: how should I access the information about "type instance"s via the GHC API? My aim is to do so after type checking, that is, to get that information from a TypecheckedModule. However, I haven't yet been able to touch the right buttons to make it work ;(
> >
> > Thanks in advance,
> > Alejandro
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-Cafe at haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell-cafe
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140727/6d33bd8a/attachment.html>


More information about the Haskell-Cafe mailing list