Safe Haskell | None |
---|---|
Language | Haskell2010 |
This module provides efficient and streaming left map-with-accumulator that
you can combine using
Applicative
style.
Import this module qualified to avoid clashing with the Prelude:
>>>
import qualified Control.Scanl as SL
Use
scan
to apply a
Scan
to a list (or other
Traversable
structures)
from left to right, and
scanr
to do so from right to left.
Note that the
Scan
type does not supersede the
Fold
type nor does the
Fold
type supersede the
Scan
type. Each type has a unique advantage.
For example,
Scan
s can be chained end-to-end:
(>>>) :: Scan a b -> Scan b c -> Scan a c
In other words,
Scan
is an instance of the
Category
typeclass.
Fold
s cannot be chained end-to-end
Vice versa,
Fold
s can produce a result even when fed no input:
extract :: Fold a b -> b
In other words,
Fold
is an instance of the
Comonad
typeclass.
A
Scan
cannot produce any output until provided with at least one
input.
Synopsis
- data Scan a b = forall x. Scan (a -> State x b) x
- data ScanM m a b = forall x. ScanM (a -> StateT x m b) (m x)
- scan :: Traversable t => Scan a b -> t a -> t b
- scanM :: ( Traversable t, Monad m) => ScanM m a b -> t a -> m (t b)
- scanr :: Traversable t => Scan a b -> t a -> t b
- prescan :: Fold a b -> Scan a b
- postscan :: Fold a b -> Scan a b
- purely :: ( forall x. (a -> State x b) -> x -> r) -> Scan a b -> r
- purely_ :: ( forall x. (x -> a -> (x, b)) -> x -> r) -> Scan a b -> r
- impurely :: ( forall x. (a -> StateT x m b) -> m x -> r) -> ScanM m a b -> r
- impurely_ :: Monad m => ( forall x. (x -> a -> m (x, b)) -> m x -> r) -> ScanM m a b -> r
- generalize :: Monad m => Scan a b -> ScanM m a b
- simplify :: ScanM Identity a b -> Scan a b
- hoists :: ( forall x. m x -> n x) -> ScanM m a b -> ScanM n a b
- arrM :: Monad m => (b -> m c) -> ScanM m b c
- premap :: (a -> b) -> Scan b r -> Scan a r
- premapM :: Monad m => (a -> m b) -> ScanM m b r -> ScanM m a r
Scan Types
Efficient representation of a left map-with-accumulator that preserves the scan's step function and initial accumulator.
This allows the
Applicative
instance to assemble derived scans that
traverse the container only once
A '
Scan
a b' processes elements of type
a
replacing each with a
value of type
b
.
Instances
Like
Scan
, but monadic.
A '
ScanM
m a b' processes elements of type
a
and
results in a monadic value of type
m b
.
Instances
Monad m => Arrow ( ScanM m) Source # | |
Defined in Control.Scanl |
|
Functor m => Profunctor ( ScanM m) Source # | |
Defined in Control.Scanl dimap :: (a -> b) -> (c -> d) -> ScanM m b c -> ScanM m a d Source # lmap :: (a -> b) -> ScanM m b c -> ScanM m a c Source # rmap :: (b -> c) -> ScanM m a b -> ScanM m a c Source # (#.) :: forall a b c q. Coercible c b => q b c -> ScanM m a b -> ScanM m a c Source # (.#) :: forall a b c q. Coercible b a => ScanM m b c -> q a b -> ScanM m a c Source # |
|
Monad m => Category ( ScanM m :: Type -> Type -> Type ) Source # | |
Functor m => Functor ( ScanM m a) Source # | |
Applicative m => Applicative ( ScanM m a) Source # | |
Defined in Control.Scanl pure :: a0 -> ScanM m a a0 Source # (<*>) :: ScanM m a (a0 -> b) -> ScanM m a a0 -> ScanM m a b Source # liftA2 :: (a0 -> b -> c) -> ScanM m a a0 -> ScanM m a b -> ScanM m a c Source # (*>) :: ScanM m a a0 -> ScanM m a b -> ScanM m a b Source # (<*) :: ScanM m a a0 -> ScanM m a b -> ScanM m a a0 Source # |
|
( Monad m, Floating b) => Floating ( ScanM m a b) Source # | |
Defined in Control.Scanl exp :: ScanM m a b -> ScanM m a b Source # log :: ScanM m a b -> ScanM m a b Source # sqrt :: ScanM m a b -> ScanM m a b Source # (**) :: ScanM m a b -> ScanM m a b -> ScanM m a b Source # logBase :: ScanM m a b -> ScanM m a b -> ScanM m a b Source # sin :: ScanM m a b -> ScanM m a b Source # cos :: ScanM m a b -> ScanM m a b Source # tan :: ScanM m a b -> ScanM m a b Source # asin :: ScanM m a b -> ScanM m a b Source # acos :: ScanM m a b -> ScanM m a b Source # atan :: ScanM m a b -> ScanM m a b Source # sinh :: ScanM m a b -> ScanM m a b Source # cosh :: ScanM m a b -> ScanM m a b Source # tanh :: ScanM m a b -> ScanM m a b Source # asinh :: ScanM m a b -> ScanM m a b Source # acosh :: ScanM m a b -> ScanM m a b Source # atanh :: ScanM m a b -> ScanM m a b Source # log1p :: ScanM m a b -> ScanM m a b Source # expm1 :: ScanM m a b -> ScanM m a b Source # |
|
( Monad m, Fractional b) => Fractional ( ScanM m a b) Source # | |
( Monad m, Num b) => Num ( ScanM m a b) Source # | |
Defined in Control.Scanl (+) :: ScanM m a b -> ScanM m a b -> ScanM m a b Source # (-) :: ScanM m a b -> ScanM m a b -> ScanM m a b Source # (*) :: ScanM m a b -> ScanM m a b -> ScanM m a b Source # negate :: ScanM m a b -> ScanM m a b Source # abs :: ScanM m a b -> ScanM m a b Source # signum :: ScanM m a b -> ScanM m a b Source # fromInteger :: Integer -> ScanM m a b Source # |
|
( Monad m, Semigroup b) => Semigroup ( ScanM m a b) Source # | |
( Monad m, Monoid b) => Monoid ( ScanM m a b) Source # | |
Scanning
scan :: Traversable t => Scan a b -> t a -> t b Source #
Apply a strict left
Scan
to a
Traversable
container
scanr :: Traversable t => Scan a b -> t a -> t b Source #
Like
scan
but start scanning from the right
prescan :: Fold a b -> Scan a b Source #
Convert a
Fold
into a prescan
"Prescan" means that the last element of the scan is not included
postscan :: Fold a b -> Scan a b Source #
Convert a
Fold
into a postscan
"Postscan" means that the first element of the scan is not included
Utilities
purely :: ( forall x. (a -> State x b) -> x -> r) -> Scan a b -> r Source #
Upgrade a scan to accept the
Scan
type
purely_ :: ( forall x. (x -> a -> (x, b)) -> x -> r) -> Scan a b -> r Source #
Upgrade a more traditional scan to accept the
Scan
type
impurely :: ( forall x. (a -> StateT x m b) -> m x -> r) -> ScanM m a b -> r Source #
Upgrade a monadic scan to accept the
ScanM
type
impurely_ :: Monad m => ( forall x. (x -> a -> m (x, b)) -> m x -> r) -> ScanM m a b -> r Source #
Upgrade a more traditional monadic scan to accept the
ScanM
type
premap :: (a -> b) -> Scan b r -> Scan a r Source #
(premap f scaner)
returns a new
Scan
where f is applied at each step
scan (premap f scaner) list = scan scaner (map f list)
premap id = id premap (f . g) = premap g . premap f
premap k (pure r) = pure r premap k (f <*> x) = premap k f <*> premap k x