<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:12.8px">----- Pragmas</span><br style="font-size:12.8px"><span style="font-size:12.8px">  * Examples:</span><br style="font-size:12.8px"><span style="font-size:12.8px">      - newtype T a = T a deriving ({-# BUILTIN #-} Eq, {-# GND #-}</span><br style="font-size:12.8px"><span style="font-size:12.8px">Ord, {-# DAC #-} Read, Show)</span><br style="font-size:12.8px"><span style="font-size:12.8px">      - deriving {-# BUILTIN #-} instance Functor T</span><br style="font-size:12.8px"><span style="font-size:12.8px">  * Pros:</span><br style="font-size:12.8px"><span style="font-size:12.8px">      - Backwards compatible</span><br style="font-size:12.8px"><span style="font-size:12.8px">      - Requires no changes to Template Haskell</span></blockquote><div><br></div><div>I can't see how this doesn't require changes to Template Haskell.</div><div>In order to generate a newtype declaration via TH one must use</div><div>`<a id="v:NewtypeD" class="" style="font-size:13px;margin:0px;padding:0px;font-weight:bold;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap">NewtypeD</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)"> </span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:Cxt" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Cxt</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)"> </span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:Name" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Name</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)"> [</span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:TyVarBndr" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">TyVarBndr</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)">] (</span><a href="http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Maybe.html#t:Maybe" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Maybe</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)"> </span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:Kind" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Kind</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)">) </span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:Con" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Con</a><span style="font-size:13px;color:rgb(0,0,0);font-family:monospace;line-height:16.12px;white-space:nowrap;background-color:rgb(240,240,240)"> </span><a href="http://hackage.haskell.org/package/template-haskell-2.11.0.0/docs/Language-Haskell-TH.html#t:Cxt" style="font-size:13px;margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;line-height:16.12px;white-space:nowrap">Cxt</a>`</div><div>where last `Cxt` param is a list of instanses to be derived,</div><div>but `Cxt` is just `[Type]` and `Type` doesn't take any Pragmas.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-17 7:02 GMT+05:00 Ryan Scott <span dir="ltr"><<a href="mailto:ryan.gl.scott@gmail.com" target="_blank">ryan.gl.scott@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm pursuing a fix to Trac #10598 [1], an issue in which GHC users do<br>
not have fine-grained control over which strategy to use when deriving<br>
an instance, especially when multiple extensions like<br>
-XGeneralizedNewtypeDeriving and -XDeriveAnyClass are enabled<br>
simultaneously. I have a working patch up at [2] which would fix the<br>
issue, but there's still a lingering question of what the right syntax<br>
is to use here. I want to make sure I get this right, so I'm<br>
requesting input from the community.<br>
<br>
To condense the conversation in [1], there are three means by which<br>
you can derive an instance in GHC today:<br>
<br>
1. -XGeneralizedNewtypeDeriving<br>
2. -XDeriveAnyClass<br>
3. GHC's builtin algorithms (which are used for deriving Eq, Show,<br>
Functor, Generic, Data, etc.)<br>
<br>
The problem is that it's sometimes hard to know which of the three<br>
will kick in when you say `deriving C`. To resolve this ambiguity, I<br>
want to introduce the -XDerivingStrategies extension, where a user can<br>
explicitly request which of the above ways to derive an instance.<br>
<br>
Here are some of the previously proposed syntaxes for this feature,<br>
with their perceived pros and cons:<br>
<br>
----- Pragmas<br>
  * Examples:<br>
      - newtype T a = T a deriving ({-# BUILTIN #-} Eq, {-# GND #-}<br>
Ord, {-# DAC #-} Read, Show)<br>
      - deriving {-# BUILTIN #-} instance Functor T<br>
  * Pros:<br>
      - Backwards compatible<br>
      - Requires no changes to Template Haskell<br>
  * Cons:<br>
      - Unlike other pragmas, these ones can affect the semantics of a program<br>
----- Type synonyms<br>
  * Examples:<br>
      - newtype T a = T a deriving (Builtin Eq, GND Ord, DAC Read, Show)<br>
      - deriving instance Builtin (Functor T)<br>
  * Pros:<br>
      - Requires no Template Haskell or parser changes, just some<br>
magic in the typechecker<br>
      - Backwards compatible (back to GHC 7.6)<br>
  * Cons:<br>
      - Some developers objected to the idea of imbuing type synonyms<br>
with magical properties<br>
----- Multiple deriving clauses, plus new keywords<br>
  * Examples:<br>
      - newtype T a = T a<br>
          deriving Show<br>
          deriving builtin instance (Eq, Foldable)<br>
          deriving newtype instance Ord<br>
          deriving anyclass instance Read<br>
      - deriving builtin instance Functor T<br>
  * Pros:<br>
      - Doesn't suffer from the same semantic issues as the other suggestions<br>
      - (Arguably) the most straightforward-looking syntax<br>
  * Cons:<br>
      - Requires breaking changes to Template Haskell<br>
      - Changes the parser and syntax significantly<br>
<br>
Several GHC devs objected to the first two of the above suggestions in<br>
[1], so I chose to implement the "Multiple deriving clauses, plus new<br>
keywords" option in [2]. However, I'd appreciate further discussion on<br>
the above options, which one you prefer, and if you have other<br>
suggestions for syntax to use.<br>
<br>
Ryan S.<br>
-----<br>
[1] <a href="https://ghc.haskell.org/trac/ghc/ticket/10598" rel="noreferrer" target="_blank">https://ghc.haskell.org/trac/ghc/ticket/10598</a><br>
[2] <a href="https://phabricator.haskell.org/D2280" rel="noreferrer" target="_blank">https://phabricator.haskell.org/D2280</a><br>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org">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><br></div>