BSD-3-Clause licensed by Edward A. Kmett
Maintained by Edward A. Kmett
This version can be pinned in stack with:comonad-5.0.6@sha256:65117d3d9e75ded548d2bbbd5ca9f5e6e1e42ecee08175aa6a77666753f797e3,3348


Hackage Build Status

This package provides comonads, the categorical dual of monads. The typeclass provides three methods: extract, duplicate, and extend.

class Functor w => Comonad w where
    extract :: w a -> a
    duplicate :: w a -> w (w a)
    extend :: (w a -> b) -> w a -> w b

There are two ways to define a comonad:

I. Provide definitions for extract and extend satisfying these laws:

extend extract      = id
extract . extend f  = f
extend f . extend g = extend (f . extend g)

In this case, you may simply set fmap = liftW.

These laws are directly analogous to the laws for monads. The comonad laws can perhaps be made clearer by viewing them as stating that Cokleisli composition must be a) associative and b) have extract for a unit:

f =>= extract   = f
extract =>= f   = f
(f =>= g) =>= h = f =>= (g =>= h)

II. Alternately, you may choose to provide definitions for fmap, extract, and duplicate satisfying these laws:

extract . duplicate      = id
fmap extract . duplicate = id
duplicate . duplicate    = fmap duplicate . duplicate

In this case, you may not rely on the ability to define fmap in terms of liftW.

You may, of course, choose to define both duplicate and extend. In that case, you must also satisfy these laws:

extend f  = fmap f . duplicate
duplicate = extend id
fmap f    = extend (f . extract)

These implementations are the default definitions of extend andduplicate and the definition of liftW respectively.

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


5.0.6 [2019.11.26]

5.0.5 [2019.05.02]

  • Raised the minimum semigroups version to 0.16.2. In addition, the package will only be required at all for GHCs before 8.0.
  • Drop the contravariant flag from comonad.cabal, as comonad no longer depends on the contravariant library.

5.0.4 [2018.07.01]

  • Add Comonad instances for Tagged s with s of any kind. Before the change, s had to be of kind *.
  • Allow containers-0.6.

5.0.3 [2018.02.06]

  • Don’t enable Safe on GHC 7.2.


  • Support doctest-0.12


  • Revamp Setup.hs to use cabal-doctest. This makes it build with Cabal-1.25, and makes the doctests work with cabal new-build and sandboxes.


  • Removed module Data.Functor.Coproduct in favor of the transformers package’s Data.Functor.Sum. n.b. Compatibility with older versions of transformers is possible using transformers-compat.
  • Add Comonad instance for Data.Functor.Sum.Sum
  • GHC 8 compatibility

  • Compiles warning-free on GHC 7.10

  • Use CPP


  • Trustworthy fixes for GHC 7.2


  • Re-export (Data.Functor.$>) rather than supply our own on GHC 7.8+
  • Better SafeHaskell support.
  • instance Monoid m => ComonadTraced m ((->) m)


  • Added a MINIMAL pragma to Comonad.
  • Added DefaultSignatures support for ComonadApply on GHC 7.2+


  • Added Kenneth Foner’s fixed point as kfix.


  • Add Comonad and ComonadEnv instances for Arg e from semigroups 0.16.3 which can be used to extract the argmin or argmax.


  • contravariant 1.0 support


  • Added flags that supply unsupported build modes that can be convenient for sandbox users.


  • transformers 0.4 compatibility


  • Fixed the ‘Typeable’ instance for ’Cokleisli on GHC 7.8.1


  • Fixes to avoid warnings on GHC 7.8.1


  • Merged the contents of comonad-transformers and comonads-fd into this package.


  • Added instance Comonad (Tagged s).


  • Trustworthy or Safe depending on GHC version


  • GHC 7.7 HEAD compatibility
  • Updated build system