kleisli: Kleisli-like newtypes with different type parameter orderings

[ bsd3, data, library ] [ Propose Tags ] [ Report a vulnerability ]

Three newtype wrappers around p a (f b) with different type parameter orderings, enabling different type class instances depending on which parameter is last:

  • Kleisli p a f b — functor in b (Functor, Applicative, Monad, etc.)

  • ProKleisli p f a b — profunctor in (a, b) (Profunctor, Category, Arrow, etc.)

  • ContraKleisli p b f a — contravariant in a (Contravariant, Divisible, Decidable)

All three are representationally identical and connected by isomorphisms. When p is specialised to (->), extensive instances are derived via Star, ReaderT, Arrow.Kleisli, and Op.


[Skip to Readme]

Modules

[Index] [Quick Jump]

Flags

Manual Flags

NameDescriptionDefault
dev

Enable development warnings (-Werror, -O2 for benchmarks)

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.0.1
Change log changelog.md
Dependencies adjunctions (>=4.3 && <5), base (>=4.8 && <6), comonad (>=5 && <6), contravariant (>=1 && <2), deepseq (>=1.4 && <2), distributive (>=0.5 && <1), lens (>=4 && <6), mtl (>=2.2 && <3), profunctors (>=5 && <6), selective (>=0.5 && <1), semigroupoids (>=5.2 && <7), transformers (>=0.5 && <1) [details]
Tested with ghc ==9.6.7
License BSD-3-Clause
Author Tony Morris <tmorris@tmorris.net>
Maintainer Tony Morris <tmorris@tmorris.net>
Uploaded by TonyMorris at 2026-05-26T08:42:15Z
Category Data
Home page https://gitlab.com/tonymorris/kleisli
Bug tracker https://gitlab.com/tonymorris/kleisli/-/issues
Source repo head: git clone https://gitlab.com/tonymorris/kleisli.git
Distributions
Downloads 0 total (0 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2026-05-26 [all 1 reports]

Readme for kleisli-0.0.1

[back to package description]

kleisli

Three newtype wrappers around p a (f b) with different type parameter orderings, enabling different type class instances depending on which parameter is last.

Type Parameter order Primary instances
Kleisli p a f b functor in b Functor, Applicative, Monad, MonadTrans, Distributive, Representable
ProKleisli p f a b profunctor in (a, b) Profunctor, Strong, Choice, Closed, Category, Arrow, Sieve, Representable
ContraKleisli p b f a contravariant in a Contravariant, Divisible, Decidable

All three are representationally identical (p a (f b)) and connected by isomorphisms.

Usage

When p is specialised to (->), extensive instances are derived via Star, ReaderT, Arrow.Kleisli, and Op:

import Data.Kleisli

-- Kleisli: use as a functor/monad in the result
k :: Kleisli (->) Int Maybe Int
k = fmap (+1) (Kleisli Just)

-- ProKleisli: use as a profunctor/arrow
p :: ProKleisli (->) Maybe Int Int
p = arr (+1) >>> arr (*2)

-- ContraKleisli: use as a contravariant functor
c :: ContraKleisli (->) Int Maybe Int
c = contramap (+1) (ContraKleisli Just)

Type aliases

Convenient aliases eliminate common type parameters:

type Kleisli'  p a b = Kleisli p a Identity b       -- no functor layer
type KleisliA  a f b = Kleisli (->) a f b           -- specialise profunctor to (->)
type KleisliA' a b   = KleisliA a Identity b        -- both specialised

Analogous aliases exist for ProKleisli and ContraKleisli.

Isomorphisms

Lens Isos convert between the three orderings:

_Kleisli_ProKleisli    :: Iso (Kleisli p a f b) ... (ProKleisli p f a b) ...
_Kleisli_ContraKleisli :: Iso (Kleisli p a f b) ... (ContraKleisli p b f a) ...

Identity-eliminating isos map through the Identity wrapper:

kleisli' :: Iso (Kleisli' p a b) ... (p a b) ...

Building

cabal build
cabal test doctest
cabal bench