Kan extensions, Kan lifts, the Yoneda lemma, and (co)density (co)monads http://github.com/ekmett/kan-extensions/

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD-3-Clause licensed by Edward A. Kmett
Maintained by Edward A. Kmett


Hackage Build Status

This package provides tools for working with various Kan extensions and Kan lifts in Haskell.

Among the interesting bits included are:

  • Right and left Kan extensions (Ran and Lan)
  • Right and left Kan lifts (Rift and Lift)
  • Multiple forms of the Yoneda lemma (Yoneda)
  • The Codensity monad, which can be used to improve the asymptotic complexity of code over free monads (Codensity, Density)
  • A “comonad to monad-transformer transformer” that is a special case of a right Kan lift. (CoT, Co)

Contact Information

Contributions and bug reports are welcome!

Please feel free to contact me through github or on the #haskell IRC channel on irc.freenode.net.

-Edward Kmett


5.2.1 [2020.10.01]

  • Allow building with GHC 9.0.

5.2 [2018.07.03]

  • Make Codensity levity polymorphic.
  • Add the Data.Functor.Invariant.Day module, which combines the covariant and contravariant versions of Day. As a result, kan-extensions now depends on the invariant package.
  • Add a wrapCodensity function.
  • More efficient Eq1, Ord1, and Adjunction instances for Coyoneda.
  • Add INLINE pragmas on more functions.
  • Allow building with containers-0.6.

5.1 [2018.01.28]

  • Make Density, Codensity, Kan and Lan polykinded.
  • Add Eq1, Ord1, Read1 and Show1 instances for Coyoneda and Yoneda.
  • Change contexts of Eq and Ord instances of Coyoneda and Yoneda (and the Show instance for Coyoneda) to require lifted class instances, e.g. Eq1 f, Eq a.
  • Allow free-5.


  • Added hoistCoyoneda


  • Removed some redundant constraints


  • Move Data.Functor.Kan.Rift to Data.Functor.Day.Curried


  • Builds clean on GHC 7.10


  • semigroupoids 5 support


  • Add liftRift and lowerRift


  • Remove pointed dependency


  • Added Applicative instance for Day
  • Added Typeable instance for Codensity

  • Added tagged dependency


  • Moved co- and contra- variant Day convolution from contravariant to here. Day convolution is intimately connected to Rift.


  • Added liftCoT0M, liftCoT1M, diter and dctrlM for using CoT w m to model a state machine with states in w and effects in m.


  • Made fixes necessary to work around changes in ImpredicativeTypes for GHC 7.8.1rc2


  • Bug fix so we can compile on GHC 7.4


  • Removed keys dependency
  • Now compatible with adjunctions 4.0


  • Moved all the Yoneda variants around again.
  • Improved haddocks


  • Added Data.Functor.Contravariant.Yoneda to complete the set of Yoneda embeddings/reductions.


  • Added several missing isomorphisms


  • instance Monad m => MonadSpec (Yoneda m)


  • Fixed a bug in the signature for composedRepToCodensity.


  • More combinators for Rift/Lift.
  • Added combinators for working with representable functors rather than just adjoint functors.
  • Split Data.Functor.KanExtension into Data.Functor.Kan.Ran and Data.Functor.Kan.Lan
  • Split Data.Functor.KanLift into Data.Functor.Kan.Rift and Data.Functor.Kan.Lift
  • Moved from Data.Functor.Yoneda.Contravariant to Data.Functor.Yoneda.Reduction adopting terminology from Todd Trimble.
  • Added various missing isomorphisms.
  • Greatly improved the Haddocks for this package stating laws and derivations where we can (especially for ‘Rift’ and ‘Ran’).


  • Rift is now Applicative. Added rap.


  • Added right and left Kan lifts under Data.Functor.KanLift.
  • Decreased reliance on the Composition class where unnecessary in the API


  • Marked modules Trustworthy as required for SafeHaskell in the presence of these extensions.


  • Refactored build system
  • IRC build-bot notification
  • Removed upper bounds on dependencies on my other packages


  • Moved Control.Monad.Free.Church over to the free package instead and removed it from kan-extensions