HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulesemigroupoids-6.0.1Haskell2010

Data.Functor.Contravariant.Divise

This module is only available if building with GHC 8.6 or later, or if the +contravariant cabal build flag is available.

  • 1 type
  • 1 class
  • 3 values
classclass Contravariant f => Divise (f :: Type -> Type) where
#

The contravariant analogue of Apply; it is Divisible without conquer.

If one thinks of f a as a consumer of as, then divise allows one to handle the consumption of a value by splitting it between two consumers that consume separate parts of a.

divise takes the "splitting" method and the two sub-consumers, and returns the wrapped/combined consumer.

All instances of Divisible should be instances of Divise with divise = divide.

If a function is polymorphic over Divise f (as opposed to Divisible f), we can provide a stronger guarantee: namely, that any input consumed will be passed to at least one sub-consumer. With Divisible f, said input could potentially disappear into the void, as this is possible with conquer.

Mathematically, a functor being an instance of Divise means that it is "semigroupoidal" with respect to the contravariant (tupling) Day convolution. That is, it is possible to define a function (f Day f) a -> f a in a way that is associative.

Methods

  • divise :: (a -> (b, c)) -> f b -> f c -> f a

    Takes a "splitting" method and the two sub-consumers, and returns the wrapped/combined consumer.

Instances29Divise, …
  • Divise ComparisonDefined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise EquivalenceDefined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise PredicateDefined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divisible f => Divise (WrappedDivisible f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    This instance is only available if the +contravariant cabal flag is enabled.

  • Semigroup r => Divise (Op r)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Unlike Divisible, requires only Semigroup on r.

  • Divise ProxyDefined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise U1Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise V1Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Has no Divisible instance.

  • Divise m => Divise (MaybeT m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Semigroup m => Divise (Const m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Unlike Divisible, requires only Semigroup on m.

  • Semigroup m => Divise (Constant m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Unlike Divisible, requires only Semigroup on m.

  • Divise f => Divise (Alt f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise f => Divise (Rec1 f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise f => Divise (Backwards f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise f => Divise (IdentityT f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise f => Divise (Reverse f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (ExceptT e m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (ReaderT r m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (StateT s m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (StateT s m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (WriterT w m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (WriterT w m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • (Divise f, Divise g) => Divise (Product f g)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • (Divise f, Divise g) => Divise (f :*: g)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise f => Divise (M1 i c f)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (RWST r w s m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • Divise m => Divise (RWST r w s m)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise
  • (Apply f, Divise g) => Divise (Compose f g)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Unlike Divisible, requires only Apply on f.

  • (Apply f, Divise g) => Divise (f :.: g)Defined in semigroupoids-6.0.1 · Data.Functor.Contravariant.Divise

    Unlike Divisible, requires only Apply on f.

valuegdivise
  1. :: (Divise (Rep1 f), Generic1 f)
  2. => a -> (b, c)
  3. -> f b
  4. -> f c
  5. -> f a
#

Generic divise. Caveats:

  1. Will not compile if f is a sum type.

  2. Will not compile if f contains fields that do not mention its type variable.

  3. -XDeriveGeneric is not smart enough to make instances where the type variable appears in negative position.

valuedivised :: Divise f => f a -> f b -> f (a, b)
#

Combine a consumer of a with a consumer of b to get a consumer of (a, b).

divised = divise id
newtypenewtype WrappedDivisible (f :: Type -> Type) a
#

Wrap a Divisible to be used as a member of Divise

Constructors

Instances4Contravariant, Conclude, Decide, Divise