<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        mso-fareast-language:EN-GB;}
span.EmailStyle24
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
.MsoPapDefault
        {mso-style-type:export-only;
        margin-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Replying by email because I’m on  a train.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Huh.   Put otherwise, your point is this.  Suppose we<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">have the following kind for `(->)`:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">   (->) :: forall v1 v2 r1 r2.  TYPE v1 r1 -> TYPE v2 r2 -> Type<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">To coerce from<o:p></o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">   (C a -> Int) to (a -> Int)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">we'd have to cough up a coercion `g`:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">g :    (->) Vanilla    Vanilla Ptr Ptr (C a) Int<o:p></o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">     ~R (->) Constraint Vanilla Ptr Ptr a     Int<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">And now (Nth 1 g :: Vanilla ~R Constraint).  Nothing about<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">`KindCo` there; it's just that `(->)` takes some kind<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">arguments.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">But that can only happen if `(->)` has suitable roles.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">What if it doesn't?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">What if we just had an axiom<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">axArrow v ::    (->) Vanilla    v
<o:p></o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">             ~R (->) Constraint v<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">or something like that.   Then we get<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">[W] g :    (->) Vanilla    Vanilla Ptr Ptr (C a) Int<o:p></o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">        ~R (->) Constraint Vanilla Ptr Ptr a     Int<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">We decompose partly and solve thus<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="Code"><span style="mso-fareast-language:EN-US">g = (axArrow Vanilla) <Ptr> <Ptr> axC <Int><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></a></p>
<span style="mso-bookmark:_MailEndCompose"></span>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> noreply@phabricator.haskell.org [mailto:noreply@phabricator.haskell.org]
<br>
<b>Sent:</b> 31 January 2017 12:51<br>
<b>To:</b> Simon Peyton Jones <simonpj@microsoft.com><br>
<b>Subject:</b> [Differential] [Commented On] D2038: [WIP] TysPrim: Generalize kind of (->)<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="5" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
goldfire added a comment. <o:p></o:p></p>
<p class="MsoNormal"><a href="https://phabricator.haskell.org/D2038"><b><span style="color:#464C5C;background:#F7F7F9;text-decoration:none">View Revision</span></b></a><o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<div>
<div>
<blockquote style="border:none;border-left:solid #8C98B8 2.25pt;padding:0cm 0cm 0cm 9.0pt;margin-left:0cm;margin-top:3.0pt;margin-right:0cm;margin-bottom:9.0pt">
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;background:#F8F9FC">
<span style="font-size:10.0pt;font-family:"Calibri",sans-serif;color:#6B748C">In <a href="https://phabricator.haskell.org/D2038#89360">
<b><span style="color:black;border:none windowtext 1.0pt;padding:0cm;background:#E7E7E7;text-decoration:none">D2038#89360</span></b></a>,
<a href="https://phabricator.haskell.org/p/simonpj/"><b><span style="color:#19558D;border:none windowtext 1.0pt;padding:0cm;background:#F1F7FF">@simonpj</span></b></a> wrote:<o:p></o:p></span></p>
</div>
<div>
<p style="background:#F8F9FC"><i><span style="color:#6B748C">To avoid being able to extract
</span></i><tt><i><span style="font-size:10.0pt;color:#6B748C;background:#EBEBEB">ContraintRep ~R LiftedPtrRep</span></i></tt><i><span style="color:#6B748C"> we decided to weaken one of the coercion constructors, the one that gets a kind coercion from a type
 coercion. We don't need it, and it's awkward here.<o:p></o:p></span></i></p>
</div>
</blockquote>
<p>The problem is that we need it with this patch. I was able to weaken this coercion constructor (<tt><span style="font-size:10.0pt;background:#EBEBEB">KindCo</span></tt>) in my patch
<a href="https://phabricator.haskell.org/D3023"><b><span style="color:black;border:none windowtext 1.0pt;padding:0cm;background:#E7E7E7;text-decoration:none">D3023</span></b></a>, but this patch uses it in a fundamental way that we can't get around. To wit:<o:p></o:p></p>
<div style="margin-top:9.0pt;margin-bottom:9.0pt">
<pre style="line-height:11.25pt"><span style="font-size:8.5pt;font-family:Consolas">class C a where<o:p></o:p></span></pre>
<pre style="line-height:11.25pt"><span style="font-size:8.5pt;font-family:Consolas">  meth :: a<o:p></o:p></span></pre>
<pre style="line-height:11.25pt"><span style="font-size:8.5pt;font-family:Consolas"><o:p> </o:p></span></pre>
<pre style="line-height:11.25pt"><span style="font-size:8.5pt;font-family:Consolas">axC :: (C a :: Constraint) ~R (a :: Type)<o:p></o:p></span></pre>
</div>
<p>Now, we wish to cast <tt><span style="font-size:10.0pt;background:#EBEBEB">C a -> a</span></tt> to
<tt><span style="font-size:10.0pt;background:#EBEBEB">a -> a.</span></tt>. This cast will look like
<tt><span style="font-size:10.0pt;background:#EBEBEB">(->) ?? <LiftedRep> axC <a></span></tt>. What goes in the
<tt><span style="font-size:10.0pt;background:#EBEBEB">??</span></tt>? It's got to be something involving
<tt><span style="font-size:10.0pt;background:#EBEBEB">KindCo axC</span></tt>, which is disallowed as per our earlier decision. Therein lies the problem.<o:p></o:p></p>
<p>As for <tt><span style="font-size:10.0pt;background:#EBEBEB">reify</span></tt>: Yes, I'm agreed with that email. But is that implemented yet? Is a design settled on? I don't see a ghc-proposal. Are we wiling to take a dependency on that work in order to
 get this done?<o:p></o:p></p>
<p>To be clear, my chief worry isn't that these problems cannot be solved by any means -- I'm just worried about the timing of this all and our desire to get 8.2 out the door.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">REPOSITORY</span></strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p></o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">rGHC Glasgow Haskell Compiler<o:p></o:p></span></p>
</div>
</div>
</div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">REVISION DETAIL</span></strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><a href="https://phabricator.haskell.org/D2038">https://phabricator.haskell.org/D2038</a><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">EMAIL PREFERENCES</span></strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><a href="https://phabricator.haskell.org/settings/panel/emailpreferences/">https://phabricator.haskell.org/settings/panel/emailpreferences/</a><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">To:
</span></strong><span style="font-size:10.0pt;font-family:"Calibri",sans-serif">bgamari, goldfire, austin<br>
<strong><span style="font-family:"Calibri",sans-serif">Cc: </span></strong>simonpj, RyanGlScott, thomie<o:p></o:p></span></p>
</div>
</div>
</div>
</body>
</html>