<div dir="ltr">Thanks for such a detailed answer :)<div><br></div><div>I'll try to put this in practice as soon as possible</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-27 16:01 GMT+02:00 Richard Eisenberg <span dir="ltr"><<a href="mailto:eir@cis.upenn.edu" target="_blank">eir@cis.upenn.edu</a>></span>:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>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.</div>

<div><br></div><div>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.</div>

<div><br></div><div>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.</div>

<div><br></div><div>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.</div>

<div><br></div><div>I hope this helps!</div><span class="HOEnZb"><font color="#888888"><div>Richard</div></font></span><div><div class="h5"><br><div><div>On Jul 26, 2014, at 4:57 AM, Alejandro Serrano Mena <<a href="mailto:trupill@gmail.com" target="_blank">trupill@gmail.com</a>> wrote:</div>

<br><blockquote type="cite"><div dir="ltr">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:<div><br></div>

<div><font face="courier new, monospace">type family F (x :: Bool)</font></div>

<div><font face="courier new, monospace">type instance F y = ()</font></div><div><font face="courier new, monospace">                ^</font></div><div><br></div><div>where <font face="courier new, monospace">^</font> marks the point from where I want the information, I want to get "<font face="courier new, monospace">y</font> has kind <font face="courier new, monospace">Bool</font>". </div>



<div><br></div><div>The approach I'm taking is obtaining the <font face="courier new, monospace">LHsType Name</font> from the specific position in the <font face="courier new, monospace">RenamedSource</font> of the file. Then, I'm trying to convert that <font face="courier new, monospace">LHsType Name</font> to a <font face="courier new, monospace">Type</font> using functions in <font face="courier new, monospace">HscTypes</font>, but I always get complaints about not existing variables.</div>



<div><br></div><div>In the past, I implemented something similar for normal functions. However, in that case I could get the information directly from <font face="courier new, monospace">TypecheckedSource</font>, by querying for a pattern variable with the right location. However, in the <font face="courier new, monospace">TypecheckedSource</font> there's no information about type families at all :( My other possibility seems to use the <font face="courier new, monospace">ModuleInfo</font>, but in those places there's no information of location :(</div>



<div><br></div><div>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)?</div>



<div><br></div><div>Thanks in advance.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-25 18:12 GMT+02:00 Alejandro Serrano Mena <span dir="ltr"><<a href="mailto:trupill@gmail.com" target="_blank">trupill@gmail.com</a>></span>:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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!</div>




<div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-23 23:38 GMT+02:00 Richard Eisenberg <span dir="ltr"><<a href="mailto:eir@cis.upenn.edu" target="_blank">eir@cis.upenn.edu</a>></span>:<div><div>

<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Does FamInstEnv.lookupFamInstEnv work for you? You will also probably want FamInst.tcGetFamInstEnvs.<br>
<br>
Richard<br>
<div><br>
On Jul 23, 2014, at 2:48 PM, Alejandro Serrano Mena <<a href="mailto:trupill@gmail.com" target="_blank">trupill@gmail.com</a>> wrote:<br>
<br>
> Dear Café,<br>
> My quest for obtaining information about type families continues.<br>
> 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 ;(<br>





><br>
> Thanks in advance,<br>
> Alejandro<br>
</div>> _______________________________________________<br>
> Haskell-Cafe mailing list<br>
> <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
> <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div>
</blockquote></div><br></div></div></div></blockquote></div><br></div>