BSD-3-Clause licensed by Edward A. Kmett
Maintained by Edward A. Kmett
This version can be pinned in stack with:semigroups-0.20@sha256:925341e6f7eb104cb490bef06eab93bb7995c7c67c51ee938185a2ddefa7aaf2,6333

Module documentation for 0.20

There are no documented modules for this package.


Hackage Build Status

Haskellers are usually familiar with monoids. A monoid has an appending operation <> or mappend and an identity element mempty. A Semigroup has an append <>, but does not require an mempty element. A Monoid can be made a Semigroup with just instance Semigroup MyMonoid

More formally, a semigroup is an algebraic structure consisting of a set together with an associative binary operation. A semigroup generalizes a monoid in that there might not exist an identity element. It also (originally) generalized a group (a monoid with all inverses) to a type where every element did not have to have an inverse, thus the name semigroup.

Data.Semigroup and Data.List.NonEmpty were added to base as of This package now offers a backwards-compatible API and some tools for deriving semigroups with generics.

Contact Information

Contributions and bug reports are welcome!

Please feel free to contact me through github or on the #haskell IRC channel on

-Edward Kmett


0.20 [2021.11.15]

  • Support hashable-1.4. The Hashable1 instances added in 0.19.2 are removed for all types except NonEmpty, in accordance with the corresponding changes from hashable-1.4.

0.19.2 [2021.08.30]

  • Backport Hashable1 instances for NonEmpty, Min, Max, First, Last, WrappedMonoid, and Option.

0.19.1 [2019.08.27]

  • Add GenericSemigroupMonoid, an adapter newtype suitable for DerivingVia, to Data.Semigroup.Generic.
  • Work around a bug related to the backported Generic(1) instances in this package (that could only be triggered on GHC 7.2 or 7.4) in which the hand-written Datatype, Constructor, and Selector instances for internal data types could overlap with GHC-generated instances.

0.19 [2019.05.10]

  • The (<>) method of the backported Semigroup class no longer has a default implementation in terms of mappend. This mirrors the Data.Semigroup API that was introduced in base-4.9. This is a breaking change for any Semigroup instances that are defined in tandem with versions of base older than 4.9.
  • Make the backported Hashable Arg instance reflect its respective variants in the hashable package. In hashable-1.3, the Hashable Arg instance only hashes the first argument, lest equal values have different hashes.
  • Backport the Lift (NonEmpty a) instance introduced in template-haskell-
  • Data.List.NonEmpty is now unconditionally Trustworthy.

0.18.5 [2018.07.02]

  • Use a more efficient sconcat for the Semigroup instances for strict and lazy ByteString.

0.18.4 [2018.01.29]

  • Backport Semigroup instances for Data.Ord.Down and strict ST, which were added in base-4.11.


  • Add Semigroup instance for IO, as well as for Event and Lifetime from GHC.Event
  • Add Eq1, Ord1, Read1, and Show1 instances for NonEmpty
  • Define Generic and Generic1 instances back to GHC 7.2, and expose the Data.Semigroup.Generic module on GHC 7.2


  • Depend on the bytestring-builder package to ensure Semigroup instances for bytestring Builder and ShortByteString are always defined
  • Allow building with binary-0.8.3 and later


  • Add the missing instance for Data.Binary.Builder.Builder.

  • Added support for base-4.9


  • Removed the partial functions words, unwords, lines, unlines

  • Fixed the @since annotations


  • Added groupWith, groupAllWith, groupWith1, groupAllWith1
  • Renamed sortOn to sortWith to match the “Comprehensive comprehensions” paper and TransformListComp extension.
  • Add Semigroup instances for Alt, Void, Proxy and Tagged
  • Add Num instances for Min and Max
  • Removed times1p in favor of stimes.

  • Cleaned up imports to remove warnings on GHC 7.10.

  • Restored the ability to build on GHC < 7.6. (Generic1 deriving was only added in GHC 7.6)


  • Added genericMappend and supporting GSemigroup class for generically deriving Semigroup instances.
  • Added Arg a b which only compares for equality/order on its first argument, which can be used to compute argmin and argmax.
  • Add Bifunctor Arg instance to avoid orphans for GHC 7.10+.
  • Added missing Data.Monoid.Generic module to source control.


  • Added Semigroup instances for various Builder constructions in text and bytestring where available.
  • Added MonadFix and MonadPlus instances for NonEmpty.

  • Bumped deepseq version bound for GHC 7.10 compatibility.


  • times1p and timesN are now reduced to accepting only a Natural argument. Whole doesn’t exist in GHC 7.10’s Numeric.Natural, and nats version 1 has removed support for the class.


  • Use Data.Coerce.coerce on GHC 7.8+ to reduce the number of eta-expansions in the resulting core.
  • Avoid conflict with pending Foldable.length in base.


  • instance NFData a => NFData (NonEmpty a)
  • Added NFData instances for the types in Data.Semigroup


  • Fixed a Trustworthiness problem for GHC 7.8+


  • Nathan van Doorn fixed a number of embarrassing bugs in the Enum instances.


  • instance IsList NonEmpty


  • Allow for manual removal of dependencies to support advanced sandbox users who explicitly want to avoid compiling certain dependencies they know they aren’t using.

    We will fix bugs caused by any combination of these package flags, but the API of the package should be considered the default build configuration with all of the package dependency flags enabled.

  • Will now build as full-fledged Safe Haskell if you configure with -f-hashable.

  • Added some missing Generic/Generic/Hashable instances

  • Generic support requires ghc-prim on GHC 7.4.


  • Added instances for ‘Generic’, ‘Foldable’, ‘Traversable’, ‘Enum’, ‘Functor’, ‘Hashable’, ‘Applicative’, ‘Monad’ and ‘MonadFix’


  • Vastly widened the dependency bound on text and bytestring.


  • Updated to support the new version of text.
  • Added transpose, sortBy and sortWith.


  • Added an instance for Const r.
  • Added some1


  • Added the missing instance for HashSet.


  • Added support for unordered-containers, bytestring and text.


  • Added a DefaultSignature for (<>) in terms of mappend.


  • Added timesN.


  • Moved Numeric.Natural to a separate nats package.