selective-0.7.0.1: Selective applicative functors

Copyright | (c) Andrey Mokhov 2018-2024
License | MIT (see the file LICENSE)
Maintainer | andrey.mokhov@gmail.com
Stability | experimental
Safe Haskell | Safe-Inferred
Language | Haskell2010

Control.Selective.Rigid.Free

Contents

- Free rigid selective functors
- Static analysis

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://dl.acm.org/doi/10.1145/3341694.

This module defines free rigid selective functors. Rigid selective functors are those that satisfy the property `<*> = apS`.

Intuitively, a selective functor `f` is "rigid" if any expression `f a` is equivalent to a list of effects chained with `select` operators (the normal form given by the free construction). In contrast, "non-rigid" selective functors can have non-linear, tree-like shapes, because `*` nodes can't be straightened using the `<*> = apS` equation.

Synopsis

- data Select f a where
  - Pure :: a -> Select f a
  - Select :: Select f (Either a b) -> f (a -> b) -> Select f b
- liftSelect :: Functor f => f a -> Select f a
- getPure :: Select f a -> Maybe a
- getEffects :: Functor f => Select f a -> [f ()]
- getNecessaryEffect :: Functor f => Select f a -> Maybe (f ())
- runSelect :: Selective g => (forall x. f x -> g x) -> Select f a -> g a
- foldSelect :: Monoid m => (forall x. f x -> m) -> Select f a -> m

# Free rigid selective functors

data Select f a where Source #

Free rigid selective functors.

Constructors

Pure :: a -> Select f a |
Select :: Select f (Either a b) -> f (a -> b) -> Select f b |

#### Instances

Instances details

Functor f => Applicative (Select f) Source # |
Instance details Defined in Control.Selective.Rigid.Free Methods pure :: a -> Select f a Source # (<*>) :: Select f (a -> b) -> Select f a -> Select f b Source # liftA2 :: (a -> b -> c) -> Select f a -> Select f b -> Select f c Source # (*>) :: Select f a -> Select f b -> Select f b Source # (<*) :: Select f a -> Select f b -> Select f a Source #
Functor f => Functor (Select f) Source # |
Instance details Defined in Control.Selective.Rigid.Free Methods fmap :: (a -> b) -> Select f a -> Select f b Source # (<$) :: a -> Select f b -> Select f a Source #
Functor f => Selective (Select f) Source # |
Instance details Defined in Control.Selective.Rigid.Free Methods select :: Select f (Either a b) -> Select f (a -> b) -> Select f b Source #

liftSelect :: Functor f => 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.