semigroupoids
Semigroupoids: Category sans id
http://github.com/ekmett/semigroupoids
LTS Haskell 22.37:  6.0.1@rev:1 
Stackage Nightly 20241007:  6.0.1@rev:1 
Latest on Hackage:  6.0.1@rev:1 
semigroupoids6.0.1@sha256:f65892f65f941c7368334bdfdcdb9db2ad3952502e94e88785a5a428fa2f3f4e,7539
Module documentation for 6.0.1
 Data
 Data.Bifunctor
 Data.Functor
 Data.Groupoid
 Data.Isomorphism
 Data.Semigroup
 Data.Semigroupoid
 Data.Traversable
 Semigroupoids
semigroupoids
A semigroupoid is a Category
without id
. This package provides a range of
id
free versions of type classes, as well as some supporting functions and
data types.
Field Guide
The diagram below describes the relationships between the type classes defined
in this package, and those from base
(with some from contravariant
as well). Thickbordered
nodes correspond to type classes defined in this package; thinbordered ones are
from elsewhere. Solid edges represent subclass relationships that actually
exist; dashed edges are those which should exist in theory.
We also provide the following table. This is structured in superclass order 
thus, for any type class T
, all superclasses of T
will be listed before T
in the table.
Name  Location  Superclass of  Ideally superclass of 

Functor 
base 
Alt , Apply , Traversable 

Foldable 
base 
Traversable , Foldable1 

Bifunctor 
base 
Biapply 

Contravariant 
base 
Divise , Decide 

Semigroupoid 
semigroupoids 
Category 

Alt 
semigroupoids 
Plus 

Apply 
semigroupoids 
Bind 
Applicative 
Traversable 
base 
Traversable1 

Foldable1 
semigroupoids 
Traversable1 

Biapply 
semigroupoids 

Divise 
semigroupoids 
Divisible 

Decide 
semigroupoids 
Conclude 
Decidable 
Category 
base 
Arrow 

Plus 
semigroupoids 
Alternative 

Applicative 
base 
Alternative , Monad 

Bind 
semigroupoids 
Monad 

Traversable1 
semigroupoids 

Divisible 
contravariant 

Conclude 
semigroupoids 
Decidable 

Arrow 
base 

Alternative 
base 
MonadPlus 

Monad 
base 
MonadPlus 

Decidable 
contravariant 

MonadPlus 
base 
We omit some type class relationships from this diagram, as they are not relevant for the purposes of this package.
Contact Information
Contributions and bug reports are welcome!
Please feel free to contact me through Github or on the #haskell IRC channel on LiberaChat.
Edward Kmett
Changes
6.0.1 [2024.05.04]
 Fix a build error when compiling with
fcontravariant
.
6.0.0.1 [2023.03.16]
 When building with GHC 9.6, require
transformers >= 0.6.1
andcontainers >= 0.6.7
. This ensures thatsemigroupoids
always providesTraversable1
instances for data types fromtransformers
andcontainers
unconditionally.
6 [2023.03.12]

Drop support for GHC 7.10 and earlier.

The
Foldable1
andBifoldable1
classes have been migrated: When building with
base4.18
or later,semigroupoids
reexportsFoldable1
andBifoldable1
frombase
. (These classes were added tobase4.18
as a result of this Core Libraries proposal.)  When building with older versions of
base
,semigroupoids
reexportsFoldable1
andBifoldable1
from thefoldable1classescompat
compatibility package.
Note that the version of
Foldable1
thatsemigroupoids
defined in previous releases only had three class methods:fold1
,foldMap1
, andtoNonEmpty
. Moreover,foldMap1
had a default implementation in terms of aFoldable
constraint.base
’s version ofFoldable1
, however, has some notable differences: It has many more methods than the three listed above, such as the
foldrMap1
method. foldMap1
now has a default implementation in terms offoldrMap1
instead of in terms of aFoldable
constraint.
To avoid (1) causing issues when upgrading to
semigroupoids6
,Data.Semigroup.Foldable
only reexports thefold1
,foldMap1
, andtoNonEmpty
methods, which reflects the API in previoussemigroupoids
releases. If you want to use the other, new class methods ofFoldable1
, consider importing it fromData.Foldable1
(its home inbase
) instead.Difference (2) is trickier, because it is possible that existing code that defines valid
Foldable1
instances will need to be migrated. If you have an instance like this:import Data.Semigroup.Foldable data T a = MkT a instance Foldable T where foldMap f (MkT x) = f x instance Foldable1 T  Relying on Foldablebased defaults
Then calling
foldMap1
onT
will throw an error withsemigroupoids6
, asfoldMap1
’s default implementation no longer usesFoldable
. To migrate this code, change the instance to explicitly definefoldMap1
:instance Foldable1 T where foldMap1 f (MkT x) = f x
This approach should be backwardscompatible with previous
semigroupoids
releases.Some other side effects of this migration include:
 The
Data.Semigroup.Foldable.Class
module has been deprecated. It no longer serves a useful role, as it simply reexports a limited subset of theData.Foldable1
andData.Bifoldable1
API.  All of the
Foldable1
andBifoldable1
instances that were previously defined insemigroupoids
have now been migrated to downstream libraries (base
,bifunctors
,containers
,tagged
, andtransformers
), so it is no longer strictly necessary to depend onsemigroupoids
to make use of these instances.
 When building with

Add
Generic1
based functions for many classes, useful for writing instances:Data.Functor.Alt.(<!>)
>Data.Functor.Alt.galt
Data.Functor.Apply.{liftF2,liftF3}
>Data.Functor.Apply.{gliftF2,gliftF3}
Data.Functor.Bind.(>>)
>Data.Functor.Bind.gbind
Data.Functor.Contravariant.Conclude.{conclude,concluded}
>Data.Functor.Contravariant.Conclude.{gconclude,gconcluded}
Data.Functor.Contravariant.Decide.{decide,decided}
>Data.Functor.Contravariant.Decide.{gdecide,gdecided}
Data.Functor.Contravariant.Divise.{divise,divised}
>Data.Functor.Contravariant.Divise.{gdivise,gdivised}
Data.Functor.Extend.{duplicated,extended}
>Data.Functor.Extend.{gduplicated,gextended}
Data.Functor.Plus.zero
>Data.Functor.Plus.gzero
Data.Semigroup.Foldable.{fold1,foldMap1,toNonEmpty}
>Data.Semigroup.Foldable.{gfold1,gfoldMap1,gtoNonEmpty}
Data.Semigroup.Traversable.{traverse1,sequence1}
>Data.Semigroup.Traversable.{gtraverse1,gsequence1}
5.3.7 [2022.01.09]

Relax the
Bind
constraints in the following instances toFunctor
:instance (Bind f, Monad f) => Alt (MaybeT f) instance (Bind f, Monad f) => Plus (MaybeT f) +instance (Functor f, Monad f) => Alt (MaybeT f) +instance (Functor f, Monad f) => Plus (MaybeT f) instance (Bind f, Monad f, Semigroup e) => Alt (ExceptT e f) instance (Bind f, Monad f, Semigroup e, Monoid e) => Plus (ExceptT e f) +instance (Functor f, Monad f, Semigroup e) => Alt (ExceptT e f) +instance (Functor f, Monad f, Semigroup e, Monoid e) => Plus (ExceptT e f)  If building with transformers0.5.* or older instance (Bind f, Monad f) => Alt (ErrorT e f) instance (Bind f, Monad f, Error e) => Plus (ErrorT e f +instance (Functor f, Monad f) => Alt (ErrorT e f) +instance (Functor f, Monad f, Error e) => Plus (ErrorT e f)
5.3.6 [2021.10.07]
 Allow building with GHC 9.2.
 Allow building with
transformers0.6.*
.  Add
Alt
instance forIdentity
.  Add
Conclude
,Decide
andDivise
type classes and instances.  Add
(<.*>)
,(<*.>)
, andtraverseMaybe
functions, which make it easier to definedTraversable1
instances for data types that have fields with a combination ofTraversable
andTraversable1
instances.  Add
Semigroupoids.Do
module with overloads for use withQualifiedDo
.  Add
Apply
,Alt
,Plus
,Bind
andBindTrans
instances for the CPS versions ofWriterT
andRWST
.  Add
psum
function toData.Functor.Plus
.  Add
Categorical
data type.
5.3.5 [2020.12.31]
 The buildtype has been changed from
Custom
toSimple
. To achieve this, thedoctests
test suite has been removed in favor of usingcabaldocspec
to run the doctests.  Explicitly mark modules as
Safe
.
5.3.4 [2019.11.26]
 Achieve forward compatibility with GHC proposal 229.
5.3.3 [2019.08.27]
 Add
Alt
andPlus
instances forHashMap
from theunorderedcontainers
package.
5.3.2 [2019.01.04]
 Bump the lower bound on
semigroups
to 0.16.2, and avoid incurring the dependency entirely on recent GHCs.  Fix the build on GHC 7.0 and 7.2.
5.3.1 [2018.07.02]
 Fix a regression introduced in
semigroupoids5.3
in which some modules regressed fromTrustworthy
toUnsafe
.
5.3 [2018.07.02]
 Allow building with
containers0.6
.  Add
Alt
instances forFirst
andLast
fromData.Semigroup
, andAlt
andPlus
instances forFirst
andLast
fromData.Monoid
.  Add missing
Apply
,Bind
,Extend
,Foldable1
andTraversable1
instances forData.Semigroups
,Data.Monoid
andGHC.Generics
.
5.2.2 [2018.01.18]
 Add
optional
toData.Functor.Alt
(analogous to theoptional
function inControl.Applicative
) liftF2
is now a class method ofApply
(mirroring the fact thatliftA2
is now a class method ofApplicative
).liftF2
and(<.>)
have default definitions in terms of the other. Allow building with GHC 8.4
Apply
andBind
instances forQ
, from thetemplatehaskell
package. (As a consequence,Data.Semigroup.Foldable
is no longer aTrustworthy
module.) Add instances for
(:~:)
and(:~~:)
fromData.Type.Equality
, andCoercion
fromData.Type.Coercion
5.2.1
 Add the
toNonEmpty
method toFoldable1
. AddfoldrM1
andfoldlM1
functions toData.Semigroup.Foldable
that are defined in terms oftoNonEmpty
.  Add
Apply
,Bind
,Foldable1
, andTraversable1
instances forComplex
 Add
Apply
andBind
instances forHashMap
from theunorderedcontainers
package (on whichsemigroupoids
now depends)  Add
Semigroupoid
instances forTagged
andConst
5.2
 Revamp
Setup.hs
to usecabaldoctest
. This makes it build withCabal1.25
, and makes thedoctest
s work withcabal newbuild
and sandboxes.  Added instances to
Alt
,Plus
,Apply
,Bind
andExtend
forGHC.Generics
,Tagged
andProxy
where appropriate.
5.1
 The remaining orphan instances in
Data.Traversable.Instances
have been replaced in favor of the orphan instances fromtransformerscompat0.5
.  The documentation now states laws that instances of
Apply
are expected to uphold. doctest0.11
support Fixed compilation of tests with
stack
5.0.1
transformerscompat
0.5 support Removed some redundant constraints.
 GHC 8 support
5.0.0.4
doctest
0.10 support
5.0.0.2
 Bugfix for GHC 7.4. PolyKinds on 7.4 cause all sorts of haskell interface file errors. One of the #if guards that turned it off on 7.4 was missing and has been fixed.
5.0.0.1
 Added the CHANGELOG to the distribution so that
hackage
can link to it in the haddocks.
5
 Absorbed
Data.Bifunctor.Apply
,Data.Semigroup.Bifoldable
andData.Semigroup.Traversable
frombifunctors
.  This caused us to pick up a dependency on
tagged
.  Exiled
Data.Semifunctor.*
,Data.Semigroupoid.Product
andData.Semigroupoid.Coproduct
tosemigroupoidextras
.  This let us open up to older versions of GHC again.
 Set an explicit fixity for
<
and>
.
4.5
 Major changes to the API to support PolyKinds and DataKinds. This necessarily shuts off GHC <= 7.4.
 Orphan instances have moved upstream into a common
baseorphans
package.
4.3.1
 Added
asum1
toData.Semigroup.Foldable
.
4.3.0.1
 Support for ‘ConstrainedClassMethods’ is currently required for GHC HEAD.
4.3
 Added missing instances for
ExceptT
. Obtain it viatransformerscompat
if need be for oldtransformers
versions.  Several
Bind
andApply
instances now require somewhat more minimal contexts.
4.2
 Backported
Foldable
/Traversable
instances fromlens
4.1
Foldable1
/Traversable1
for tuples
4.0.4
contravariant
1.0 support.
4.0.3
 Added flags to provide unsupported cabal sandbox build modes.
4.0.1
 Fixed bitrot in the
Data.Functor.Extend
documentation.  Fixed warnings on GHC 7.8.1rc2 caused by importing
Control.Monad.Instances
.
4.0
 Merged in the contents of the
groupoids
andsemigroupoidextras
packages.
3.1
 Added the rectangular band
Semigroupoid
for(,)
. Would that make it a Bandoid?
3.0.3
 Claim to be
Trustworthy
where necessary
3.0.2
 Tightened the upper bounds slightly to enable PVP compliance while retaining a flexible development cycle.
 Raised the upper bound on
contravariant
.
3.0.1
 Removed upper bounds relative to my other packages
 Refactored directory layout