selective-0.5: Selective applicative functors
Copyright(c) Andrey Mokhov 2018-2019
LicenseMIT (see the file LICENSE)
Maintainerandrey.mokhov@gmail.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Control.Selective.Rigid.Freer

Description

This is a library for selective applicative functors, or just selective functors for short, an abstraction between applicative functors and monads, introduced in this paper: https://www.staff.ncl.ac.uk/andrey.mokhov/selective-functors.pdf.

This module defines freer rigid selective functors. Rigid selective functors are those that satisfy the property <*> = apS. Compared to the "free" construction from Control.Selective.Rigid.Free, this "freer" construction does not require the underlying base data type to be a functor.

Synopsis

Free rigid selective functors

data Select f a where Source #

Free rigid selective functors.

Constructors

Pure :: a -> Select f a 
Select :: Select f (Either (x -> a) a) -> f x -> Select f a 

Instances

Instances details
Functor (Select f) Source # 
Instance details

Defined in Control.Selective.Rigid.Freer

Methods

fmap :: (a -> b) -> Select f a -> Select f b #

(<$) :: a -> Select f b -> Select f a #

Applicative (Select f) Source # 
Instance details

Defined in Control.Selective.Rigid.Freer

Methods

pure :: a -> Select f a #

(<*>) :: Select f (a -> b) -> Select f a -> Select f b #

liftA2 :: (a -> b -> c) -> Select f a -> Select f b -> Select f c #

(*>) :: Select f a -> Select f b -> Select f b #

(<*) :: Select f a -> Select f b -> Select f a #

Selective (Select f) Source # 
Instance details

Defined in Control.Selective.Rigid.Freer

Methods

select :: Select f (Either a b) -> Select f (a -> b) -> Select f b Source #

liftSelect :: f a -> Select f a Source #

Lift a functor into a free selective computation.

Static analysis

getPure :: Select f a -> Maybe a Source #

Extract the resulting value if there are no necessary effects.

getEffects :: Functor f => Select f a -> [f ()] Source #

Collect all possible effects in the order they appear in a free selective computation.

getNecessaryEffect :: Functor f => Select f a -> Maybe (f ()) Source #

Extract the necessary effect from a free selective computation. Note: there can be at most one effect that is statically guaranteed to be necessary.

runSelect :: Selective g => (forall x. f x -> g x) -> Select f a -> g a Source #

Given a natural transformation from f to g, this gives a canonical natural transformation from Select f to g.

foldSelect :: Monoid m => (forall x. f x -> m) -> Select f a -> m Source #

Concatenate all effects of a free selective computation.