<div dir="ltr"><div>Unfortunately, I can't directly use tc_tuple, since I don't have access to the Haskell AST forms I need to make that work (I'm constructing everything directly in Core). On the other hand, the implementation of tc_tuple does have one nugget of wisdom in that it reveals how GHC creates a constraint tuple *type constructor*. Namely, `tcLookupTyCon (cTupleTyConName arity)` for some `arity`.</div><div><br></div><div>That's still a bit inconvenient, as `tcLookupTyCon` forces me to work in a monadic context (whereas the code I've been working on has been pure up to this point). Is there not a pure way to retrieve a constraint tuple type constructor?</div><div><br></div><div>Ryan S.<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 19, 2018 at 10:07 AM Matthew Pickering <<a href="mailto:matthewtpickering@gmail.com">matthewtpickering@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">How about `tc_tuple`?<br>
<br>
On Tue, Jun 19, 2018 at 2:53 PM, Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com" target="_blank">ryan.gl.scott@gmail.com</a>> wrote:<br>
> I'm currently working on some code in which I need to produce a Core Type<br>
> that mentions a constraint tuple. I thought that there must surely exist<br>
> some way to construct a constraint tuple using the GHC API, but to my<br>
> astonishment, I could not find anything. The closest thing I found was<br>
> mk_tuple [1], which gives you the ability to make boxed and unboxed tuples,<br>
> but not constraint tuples.<br>
><br>
> I then thought to myself, "But wait, PartialTypeSignatures has to create<br>
> constraint tuples, right? How does that part of the code work?" To my<br>
> horror, I discovered that PartialTypeSignatures actually creates *boxed*<br>
> tuples (see mk_ctuple here [2]), then hackily treats them as constraint<br>
> tuples, as explained in Note [Extra-constraint holes in partial type<br>
> signatures] [3]. I tried reading that Note, but I couldn't follow the<br>
> details.<br>
><br>
> Is there a simpler way to create a constraint tuple that I'm not aware of?<br>
><br>
> Ryan S.<br>
> -----<br>
> [1]<br>
> <a href="http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/prelude/TysWiredIn.hs#l810" rel="noreferrer" target="_blank">http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/prelude/TysWiredIn.hs#l810</a><br>
> [2]<br>
> <a href="http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/typecheck/TcBinds.hs#l1036" rel="noreferrer" target="_blank">http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/typecheck/TcBinds.hs#l1036</a><br>
> [3]<br>
> <a href="http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/typecheck/TcHsType.hs#l2367" rel="noreferrer" target="_blank">http://git.haskell.org/ghc.git/blob/676c5754e3f9e1beeb5f01e0265ffbdc0e6f49e9:/compiler/typecheck/TcHsType.hs#l2367</a><br>
><br>
> _______________________________________________<br>
> ghc-devs mailing list<br>
> <a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
><br>
</blockquote></div>