<div dir="auto">This is fantastic!</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 12, 2021 at 12:31 PM Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com">ryan.gl.scott@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'm happy to announce the 3.0 release of the singletons library, as<br>
well as the debut of its companion libraries, singletons-th and<br>
singletons-base. There's been a fair bit of improvements, cleanup, and<br>
reorganization since the last release, so I thought it appropriate to<br>
give this release a super-major version bump. This announcement will<br>
go over some highlights of the new releases, but if you want the full<br>
details, you can consult the changelog entries for each library below:<br>
<br>
* singletons-3.0: <a href="http://hackage.haskell.org/package/singletons-3.0/changelog" rel="noreferrer" target="_blank">http://hackage.haskell.org/package/singletons-3.0/changelog</a><br>
* singletons-th-3.0:<br>
<a href="http://hackage.haskell.org/package/singletons-th-3.0/changelog" rel="noreferrer" target="_blank">http://hackage.haskell.org/package/singletons-th-3.0/changelog</a><br>
* singletons-base-3.0:<br>
<a href="http://hackage.haskell.org/package/singletons-base-3.0/changelog" rel="noreferrer" target="_blank">http://hackage.haskell.org/package/singletons-base-3.0/changelog</a><br>
<br>
##########################<br>
## Why three libraries? ##<br>
##########################<br>
<br>
Instead of there just being one singletons library, there are now<br>
_three_ libraries:<br>
<br>
* singletons: A small, foundational library that defines basic<br>
singleton-related types and definitions. The new singletons library<br>
supports GHC 8.0 or later, does not depend on any external libraries,<br>
and does not make use of Template Haskell.<br>
* singletons-th: A library that defines Template Haskell functionality<br>
for promoting term-level functions to type-level equivalents and<br>
singling functions to dependently typed equivalents. This library<br>
requires bleeding-edge GHC features, and as a result, it only supports<br>
GHC 9.0 or later.<br>
* singletons-base: A library that uses singletons-th to define<br>
promoted and singled functions from the base library, including the<br>
Prelude. Similarly to singletons-th, this library only supports GHC<br>
9.0 or later.<br>
<br>
Previous singletons releases combined all of this functionality into a<br>
single library. However, discussions with singletons users revealed<br>
that this was a frequent source of pain:<br>
<br>
* The total time it took to compile the old singletons library<br>
dissuaded some from using it, especially for those who only wanted to<br>
use a small part of the library.<br>
* Some users wished to use singletons in environments where Template<br>
Haskell is not an option.<br>
* Some users wanted to use core definitions from Data.Singletons, but<br>
because the old singletons library only ever supported one GHC at a<br>
time, this was impractical.<br>
<br>
The new package structure in the 3.0 release is an attempt to address<br>
some of these pain points. In particular, most of the code which<br>
results in extensive compile times is now confined to the<br>
singletons-base library. For the full discussion that led up to this,<br>
see [1].<br>
<br>
###########################<br>
## Module reorganization ##<br>
###########################<br>
<br>
Splitting up singletons into smaller packages provided a rare<br>
opportunity to clean up the module naming conventions, which were<br>
confusing and inconsistent in many places. The 3.0 releases now use<br>
the following conventions:<br>
<br>
* All modules in singletons now begin with Data.Singletons.*.<br>
* All modules in singletons-th now begin with Data.Singletons.TH.*.<br>
* Most modules in singletons-base now reflect the modules from base<br>
from which they take inspiration. For example, the Prelude module now<br>
has a Prelude.Singletons counterpart in singletons. Similarly, there<br>
are also modules like Control.Monad.Singletons,<br>
GHC.TypeLits.Singletons, etc. All other modules that do not correspond<br>
to something in base now begin with Data.Singletons.Base.*.<br>
<br>
The convention now used in singletons-base was inspired by the<br>
conventions used in the lens library. The end result is that is now<br>
somewhat easier to figure out what parts of singletons-base to import.<br>
Because this is a significant departure from previous singletons<br>
releases, if you want to continue supporting pre-3.0 releases, you<br>
will likely need to put something like this in your .cabal file:<br>
<br>
    flag singletons-3-0<br>
      description:         Use @singletons-3.0@ or later.<br>
      default:             True<br>
<br>
    library<br>
      ...<br>
      if flag(singletons-3-0)<br>
        build-depends:<br>
          singletons-base >= 3.0<br>
          -- You may also need to depend on singletons >= 3.0 or<br>
singletons-th >= 3.0<br>
      else<br>
        build-depends:<br>
          singletons < 3.0<br>
<br>
###################<br>
## Other changes ##<br>
###################<br>
<br>
Besides the package and module reorganization mentioned above,<br>
singletons-{,th,base}-3.0 feature a variety of new quality-of-life<br>
improvements. Here are a handful of the more notable improvements:<br>
<br>
* The OptionsM type, used for configuring how the Template Haskell<br>
machinery in singletons-th works, is now an instance of Quote. This<br>
avoids the need to use the Control.Monad.Trans.Class.lift function to<br>
lift quoted declarations into OptionsM. [2]<br>
* Data.Singletons.TH.Options now defines a promotedDataTypeOrConName<br>
option. Overriding this option can be useful in situations where one<br>
wishes to promote types such as `Nat`, `Symbol`, or data types built<br>
on top of them. [3]<br>
* The internals of the ShowSing class have been refactored to allow<br>
deriving Show instances for Sing types (e.g., deriving instance<br>
ShowSing a => Show (SList (z :: [a]))). [4]<br>
* Improve the quality of GHCi's output when using :kind on types<br>
defined by singletons-th. [5]<br>
<br>
If you encounter any issues, feel free to leave a bug report at<br>
<a href="https://github.com/goldfirere/singletons/issues" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/issues</a>.<br>
<br>
Happy (type-level) hacking,<br>
<br>
Ryan S.<br>
-----<br>
[1] <a href="https://github.com/goldfirere/singletons/issues/420" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/issues/420</a><br>
[2] <a href="https://github.com/goldfirere/singletons/pull/484" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/pull/484</a><br>
[3] <a href="https://github.com/goldfirere/singletons/pull/462" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/pull/462</a><br>
[4] <a href="https://github.com/goldfirere/singletons/pull/486" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/pull/486</a><br>
[5] <a href="https://github.com/goldfirere/singletons/pull/446" rel="noreferrer" target="_blank">https://github.com/goldfirere/singletons/pull/446</a><br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div></div>