Safe Haskell | None |
---|---|
Language | Haskell98 |
Control.Scanl
Contents
Description
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 Fold
to a list (or other Traversable
structures) from left to right,
and scanr
to do so from right to left.
Synopsis
- data Scan a b = Scan (a -> State x b) x
- data ScanM m a b = 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 Methods 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 # (#.) :: Coercible c b => q b c -> ScanM m a b -> ScanM m a c Source # (.#) :: 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 Methods 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 Methods 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 Methods (+) :: 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