<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>> Another example of similar breakage was the changes to
      binders a little while ago.<br>
      <br>
      If you read GHC migration guide for 9.8 [1] (migration guides have
      been great resources, thanks to all their writers), it says<br>
      <br>
      > It is possible that Template Haskell code which compiled
      prior to GHC 9.8 will no longer compile after these changes. Here
      are some possible ways to make it compile with 9.8 in a
      backwards-compatible way, inspired by head.hackage!302 (merged):<br>
      <br>
      > * Construct TyVarBndrs using plainTV or kindedTV from
      Language.Haskell.TH.Lib, which is polymorphic over both TyVarBndr
      () and TyVarBndr BndrVis. These functions will default to using
      BndrReq on GHC 9.8.<br>
      > * The th-abstraction [2] library provides a compatibility
      layer in the Language.Haskell.TH.Datatype.TyVarBndr module.<br>
      <br>
      [1]
<a class="moz-txt-link-freetext" href="https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.8#invisible-binders-in-type-level-declarations">https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.8#invisible-binders-in-type-level-declarations</a><br>
      [2] <a class="moz-txt-link-freetext" href="https://hackage.haskell.org/package/th-abstraction">https://hackage.haskell.org/package/th-abstraction</a><br>
    </p>
    <div class="moz-cite-prefix">In my personal opinion, the development
      of `template-haskell` hits the sweet spot of evolving (i.e.
      keeping up with GHC changes, and not stagnating), but being very
      reasonable in their breakages and also guiding how to migrate.<br>
      <br>
      Of course, the template-haskell library documentation could always
      be better, e.g. `TyVarBndr` docs could mention that things have
      changed and provide a link to migration guide;  tupE docs could
      mention existence of another variant and so on. However given that
      `template-haskell` doesn't really have an owner, and changes are
      mostly forced by changes in GHC, i'm very happy with what we have
      now. (In particular I hate the `template-haskell-internal` idea
      mentioned in <a class="moz-txt-link-freetext" href="https://gitlab.haskell.org/ghc/ghc/-/issues/24021">https://gitlab.haskell.org/ghc/ghc/-/issues/24021</a>; it
      won't help me with e.g. aeson but complicate contributing to GHC,
      lose-lose).<br>
      <br>
    </div>
    <div class="moz-cite-prefix">That said, is it possible to setup the
      similar API change test for `template-haskell` as we have for
      `base`? I think it won't hurt, and may nudge contributors to
      document the changes.<br>
      <br>
      Cheers, Oleg<br>
      <br>
      <br>
      On 10.3.2024 19.11, Iavor Diatchki wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAGK9nupw=qu6=yz0DOQEOv34Qmzz1qKJ7AobZv2H7fhvT5pP8g@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div>Oh, that's really confusing, especially since the internal
          one is what shows up first when you search for stuff!</div>
        <div><br>
        </div>
        <div>Another example of similar breakage was the changes to
          binders a little while ago.<br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Sun, Mar 10, 2024 at
          10:02 AM Oleg Grenrus <<a href="mailto:oleg.grenrus@iki.fi"
            moz-do-not-send="true" class="moz-txt-link-freetext">oleg.grenrus@iki.fi</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"> >
          So what do I do?<br>
          <br>
          There are two tupE functions.<br>
          <br>
          In Language.Haskell.TH.Lib.Internal module the type has
          changed. That's <br>
          the module used by GHC itself, to represent quotations. As the
          module <br>
          documentation says<br>
          <br>
           > Language.Haskell.TH.Lib.Internal exposes some additional
          <br>
          functionality that is used internally in GHC's integration
          with Template <br>
          Haskell. This is not a part of the public API, and as such,
          there are no <br>
          API guarantees for this module from version to version.<br>
          <br>
          In the Language.Haskell.TH.Lib module which is documented as<br>
          <br>
           > Language.Haskell.TH.Lib contains lots of useful helper
          functions for <br>
          generating and manipulating Template Haskell terms<br>
          <br>
          the type of tupE [1] has been left unchanged, and it's still<br>
          <br>
              tupE :: Quote m => [m Exp] -> m Exp<br>
          <br>
          [1] <br>
          <a
href="https://hackage.haskell.org/package/template-haskell-2.21.0.0/docs/Language-Haskell-TH-Lib.html#v:tupE"
            rel="noreferrer" target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">https://hackage.haskell.org/package/template-haskell-2.21.0.0/docs/Language-Haskell-TH-Lib.html#v:tupE</a><br>
          <br>
          ---<br>
          <br>
          Oleg<br>
          <br>
          <br>
          On 10.3.2024 18.56, Iavor Diatchki wrote:<br>
          > Hello,<br>
          ><br>
          > I am not sure if this is the right list to post to, but I
          suspect <br>
          > template-haskell is mostly modified by GHC folk, which is
          why I chose <br>
          > to post here, and there is no maintainer listed, based
          just the <br>
          > `libraries` list.<br>
          ><br>
          > Template Haskell is a very useful tool, but I am always
          quite wary of <br>
          > using it, because it is so unstable.   I understand the
          need to change <br>
          > the syntax, as the language evolves, but I feel that
          changes are made <br>
          > without any consideration for backward compatibility,
          which is very <br>
          > unfortunate.<br>
          ><br>
          > To give you an example, I am currently using GHC 9.6.4,
          and I am <br>
          > working on a small TH utility.  I need to make a tuple
          expression, but <br>
          > of a dynamic size, so I can't use the special syntax, and
          need to use <br>
          > a function to do so.  So I am using the function, `tupE`,
          which has <br>
          > the following type:<br>
          ><br>
          >     tupE :: Quote m => [m Exp] -> m Exp<br>
          ><br>
          > This is quite nice and unsurprising.   When I look oh
          `hackage`, <br>
          > however, the type of this function has changed, now it
          is:<br>
          ><br>
          >    tupE :: Quote m => [m (Maybe Exp)] -> m Expr<br>
          ><br>
          > So what do I do?  Basically I should not use this
          function, because as <br>
          > soon as I upgrade the compiler everything will break! 
          Furthermore <br>
          > there is no documentation at all to explain what this
          function is <br>
          > supposed to do (I can't fathom why it is taking `Maybe`
          as arguments), <br>
          > or when it changed, etc.<br>
          ><br>
          > So my plea would be---change the syntax at will, but
          let's try to keep <br>
          > the convenience functions that build the syntax stable:
          instead of <br>
          > changing functions, it is just as easy to add a new
          function.  I <br>
          > understand that sometimes things need to change, but then
          we should <br>
          > describe what changed, and in which versions.   I don't
          think these <br>
          > are hard things to do, and I really think it will have
          great benefit <br>
          > to everyone using TH.<br>
          ><br>
          > Cheers,<br>
          > -Iavor<br>
          ><br>
          ><br>
          ><br>
          ><br>
          ><br>
          ><br>
          ><br>
          ><br>
          > _______________________________________________<br>
          > ghc-devs mailing list<br>
          > <a href="mailto:ghc-devs@haskell.org" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">ghc-devs@haskell.org</a><br>
          > <a
            href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs"
            rel="noreferrer" target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
          _______________________________________________<br>
          ghc-devs mailing list<br>
          <a href="mailto:ghc-devs@haskell.org" target="_blank"
            moz-do-not-send="true" class="moz-txt-link-freetext">ghc-devs@haskell.org</a><br>
          <a
            href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs"
            rel="noreferrer" target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>