<div dir="ltr">Thanks for posting an example—that's very helpful to figure out what is going on.<br><br>> Currently, GHC rejects the following code:<br>> <br>> {-# LANGUAGE DeriveGeneric #-}<br>> {-# LANGUAGE PolyKinds #-}<br>> import GHC.Generics<br>> <br>> data HKD f = Foo (f Int) (f Double)<br>>     | Bar (f Bool)<br>>     deriving Generic1<br>> The compilation error is<br>> <br>> • Can't make a derived instance of ‘Generic1 HKD’:<br>>     Constructor ‘Foo’ applies a type to an argument involving the last parameter<br>>                       but the applied type is not of kind * -> *, and<br>>     Constructor ‘Foo’ applies a type to an argument involving the last parameter<br>>                       but the applied type is not of kind * -> *, and<br>>     Constructor ‘Bar’ applies a type to an argument involving the last parameter<br>>                       but the applied type is not of kind * -> *<br>> • In the data declaration for ‘HKD’<br><br>I see. That error message could be worded better, in my opinion. The issue really isn't so much about the kind of `f`. If you had written `data HKD (f :: Type -> Type) = Baz (Proxy f)`, for instance, I would expect it to work. The real issue is _where_ `f` appears in the data constructors. In `Bar`, for instance, you have:<br><br>> Bar (f Bool)<br><br>`Generic1` is limited to data types where the last type parameter only appears as the last type argument in any field. This means that a field like `Proxy f` would be fine, as that would be represented as `Rec1 Proxy` in a `Rep1` instance. `f Bool`, on the other hand, is problematic. `GHC.Generics` doesn't have a representation type that simultaneously allows representing this field while also "focusing" on the last type parameter like `Rec1`, `Par1`, etc. would allow.<br><br>The `Foo` constructor has similar issues. The error-reporting machinery for `DeriveGeneric` essentially just accumulates every issue it encounters and reports everything at once, which is why there is a duplicate error message involving `Foo`. Needless to say, this kind of error message could be improved.<br><br>> Although it is possible to define a hand-rolled instance of Generic1<br><br>Really? I'm not sure how you would define a correct `Generic1` instance for `HKD` at all. What did you have in mind?<br><br>Best,<br><br>Ryan</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 13, 2021 at 8:33 AM Fumiaki Kinoshita <<a href="mailto:fumiexcel@gmail.com">fumiexcel@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Currently, GHC rejects the following code:</div><div><br></div><div>

<div style="color:rgb(212,212,212);background-color:rgb(30,30,30);font-family:Consolas,"Courier New",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre-wrap"><span style="color:rgb(86,156,214)">{-# LANGUAGE DeriveGeneric #-}</span><div style="color:rgb(212,212,212);background-color:rgb(30,30,30);font-family:Consolas,"Courier New",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre-wrap"><div><span style="color:rgb(86,156,214)">{-# LANGUAGE PolyKinds #-}</span></div><div><span style="color:rgb(86,156,214)">import</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(78,201,176)">GHC.Generics</span></div><br><div><span style="color:rgb(86,156,214)">data</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(86,156,214)">HKD</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(156,220,254)">f</span><span style="color:rgb(212,212,212)"> = Foo (</span><span style="color:rgb(156,220,254)">f</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(86,156,214)">Int</span><span style="color:rgb(212,212,212)">) (</span><span style="color:rgb(156,220,254)">f</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(86,156,214)">Double</span><span style="color:rgb(212,212,212)">)</span></div><div><span style="color:rgb(212,212,212)">    | Bar (</span><span style="color:rgb(156,220,254)">f</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(86,156,214)">Bool</span><span style="color:rgb(212,212,212)">)</span></div><div><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(86,156,214)">deriving</span><span style="color:rgb(212,212,212)"> </span><span style="color:rgb(86,156,214)">Generic1</span>
</div></div></div>

</div><div><br></div><div>The compilation error is<br></div><div><br></div><div>    • Can't make a derived instance of ‘Generic1 HKD’:<br>        Constructor ‘Foo’ applies a type to an argument involving the last parameter<br>                          but the applied type is not of kind * -> *, and<br>        Constructor ‘Foo’ applies a type to an argument involving the last parameter<br>                          but the applied type is not of kind * -> *, and<br>        Constructor ‘Bar’ applies a type to an argument involving the last parameter<br>                          but the applied type is not of kind * -> *<br>    • In the data declaration for ‘HKD’<br>  |<br>7 |     deriving Generic1</div><div><br></div><div>Although it is possible to define a hand-rolled instance of Generic1, DeriveGeneric is still restricted to Type -> Type.<br></div><div><br></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2021年10月13日(水) 21:17 Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com" target="_blank">ryan.gl.scott@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hello,</div><div><br></div><div>I'm not quite sure I understand the issue you're hitting. Generic1 is poly-kinded, so I would expect it to be able to handle data types where the last type parameter has differing kinds. Can you post a complete example of the program you expect to typecheck, but doesn't?</div><div><br></div><div>Best,</div><div><br></div><div>Ryan<br></div></div>
_______________________________________________<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>
</blockquote></div></div>
</blockquote></div>