Portability | non-portable |
---|---|
Stability | experimental |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Safe Haskell | Safe-Inferred |
- class Choice p => Scan p where
- prefix1 :: a -> p a b -> p a b
- postfix1 :: p a b -> a -> p a b
- run1 :: a -> p a b -> b
- interspersing :: a -> p a b -> p a b
- class Scan p => Folding p where
- beneath :: Profunctor p => Optic p Identity s t a b -> p a b -> p s t
- data L1 a b = forall c . L1 (c -> b) (c -> a -> c) (a -> c)
- data L1' a b = forall c . L1' (c -> b) (c -> a -> c) (a -> c)
- data M1 a b = forall m . M1 (m -> b) (a -> m) (m -> m -> m)
- data R1 a b = forall c . R1 (c -> b) (a -> c -> c) (a -> c)
- data L a b = forall r . L (r -> b) (r -> a -> r) r
- data L' a b = forall r . L' (r -> b) (r -> a -> r) r
- data M a b = forall m . M (m -> b) (a -> m) (m -> m -> m) m
- data R a b = forall r . R (r -> b) (a -> r -> r) r
- class AsRM1 p where
- class AsRM1 p => AsL1' p where
- class AsRM1 p => AsRM p where
- class (AsRM p, AsL1' p) => AsL' p where
Scaners and Foldings
class Scan p => Folding p whereSource
prefix :: Foldable t => t a -> p a b -> p a bSource
Partially apply a Folding
to some initial input on the left.
prefixOf :: Fold s a -> s -> p a b -> p a bSource
postfix :: Foldable t => p a b -> t a -> p a bSource
postfixOf :: Fold s a -> p a b -> s -> p a bSource
run :: Foldable t => t a -> p a b -> bSource
Apply a Folding
to a container full of input:
>>>
run ["hello","world"] $ L id (++) []
"helloworld"
>>>
run [1,2,3] $ L id (+) 0
6
Combinators
beneath :: Profunctor p => Optic p Identity s t a b -> p a b -> p s tSource
This acts like a generalized notion of "costrength",
when applied to a Folding
, causing it to return the
left-most value that fails to match the Prism, or the
result of accumulating rewrapped in the Prism
if
everything matches.
>>>
run [Left 1, Left 2, Left 3] $ beneath _Left $ R id (+) 0
Left 6
>>>
run [Left 1, Right 2, Right 3] $ beneath _Left $ R id (+) 0
Right 2
beneath :: Prism s t a b -> p a b -> p s t beneath :: Iso s t a b -> p a b -> p s t
Scans
Left Scans
A Mealy Machine
forall c . L1 (c -> b) (c -> a -> c) (a -> c) |
A strict Mealy Machine
forall c . L1' (c -> b) (c -> a -> c) (a -> c) |
Semigroup Scans
A semigroup reducer
forall m . M1 (m -> b) (a -> m) (m -> m -> m) |
Right Scans
A reversed Mealy machine
forall c . R1 (c -> b) (a -> c -> c) (a -> c) |
Foldings
Left Foldings
A Moore Machine
forall r . L (r -> b) (r -> a -> r) r |
Profunctor L | |
Choice L | |
Folding L | |
Scan L | |
AsL' L | We can convert from a lazy left folding to a strict left folding. |
AsL1' L | |
AsRM L | We can convert from a lazy left folding to a right or monoidal fold |
AsRM1 L | |
Monad (L a) | |
Functor (L a) | |
Applicative (L a) | |
MonadZip (L a) | |
Comonad (L a) | |
ComonadApply (L a) | |
Apply (L a) | |
Bind (L a) | |
Extend (L a) |
A strict left fold / strict Moore machine
forall r . L' (r -> b) (r -> a -> r) r |
Profunctor L' | |
Choice L' | |
Folding L' | |
Scan L' | |
AsL' L' | We can convert a lazy fold to itself |
AsL1' L' | |
AsRM L' | We can convert from a strict left folding to a right or monoidal fold |
AsRM1 L' | |
Monad (L' a) | |
Functor (L' a) | |
Applicative (L' a) | |
MonadZip (L' a) | |
Comonad (L' a) | |
ComonadApply (L' a) | |
Apply (L' a) | |
Bind (L' a) | |
Extend (L' a) |
Monoidal Foldings
Right Foldings
right folds / a reversed Moore machine
forall r . R (r -> b) (a -> r -> r) r |
Homomorphisms
Scan Homomorphisms
We define f
to be a scan homomorphism between p
and q
when:
f :: forall a b. p a b -> q a b
run1
xs (f φ) ≡run1
xs φprefix1
xs (f φ) ≡ f (prefix1
xs φ)postfix1
(f φ) xs ≡ f (postfix1
φ xs)dimap
l r (f φ) ≡ f (dimap
l r φ)pure
a ≡ f (pure
a) f φ<*>
f ψ ≡ f (φ<*>
ψ)return
a ≡ f (return
a) f φ>>=
f . k ≡ f (φ>>=
k)interspersing
a (f φ) ≡ f (interspersing
a φ)
Furthermore,
and left'
(f φ)f (
should agree whenever either answer is left'
φ)Right
and right'
(f φ)f (
should agree whenever either answer is right'
φ)Left
Folding Homomorphisms
We define f
to be a folding homomorphism between p
and q
when
f
is a scan homomorphism and additionally we can satisfy:
run
xs (f φ) ≡run
xs φrunOf
l xs (f φ) ≡runOf
l xs φprefix
xs (f φ) ≡ f (prefix
xs φ)prefixOf
l xs (f φ) ≡ f (prefixOf
l xs φ)postfix
(f φ) xs ≡ f (postfix
φ xs)postfixOf
l (f φ) xs ≡ f (postfixOf
l φ xs)extract
(f φ) ≡extract
φfiltering
p (f φ) ≡ f (filtering
p φ)
Note: A law including extend
is explicitly excluded. To work consistenly
across foldings, use prefix
and postfix
instead.
class AsRM1 p => AsRM p whereSource
asM
is a folding homomorphism to a monoidal folding
run
xs (asM
φ) ≡run
xs φprefix
xs (asM
φ) ≡asM
(prefix
xs φ)prefixOf
l xs (asM
φ) ≡asM
(prefixOf
l xs φ)postfix
(asM
φ) xs ≡asM
(postfix
φ xs)postfixOf
l (asM
φ) xs ≡asM
(postfixOf
l φ xs)left'
(asM
φ) ≡asM
(left'
φ)right'
(asM
φ) ≡asM
(right'
φ)dimap
l r (asM
φ) ≡asM
(dimap
l r φ)extract
(asM
φ) ≡extract
φpure
a ≡asM
(pure
a)asM
φ<*>
asM
ψ ≡asM
(φ<*>
ψ)return
a ≡asM
(return
a)asM
φ>>=
asM
. k ≡asM
(φ>>=
k)filtering
p (asM
φ) ≡asM
(filtering
p φ)interspersing
a (asM
φ) ≡asM
(interspersing
a φ)
asR
is a folding homomorphism to a right folding
run
xs (asR
φ) ≡run
xs φprefix
xs (asR
φ) ≡asR
(prefix
xs φ)prefixOf
l xs (asR
φ) ≡asR
(prefixOf
l xs φ)postfix
(asR
φ) xs ≡asR
(postfix
φ xs)postfixOf
l (asR
φ) xs ≡asR
(postfixOf
l φ xs)left'
(asR
φ) ≡asR
(left'
φ)right'
(asR
φ) ≡asR
(right'
φ)dimap
l r (asR
φ) ≡asR
(dimap
l r φ)extract
(asR
φ) ≡extract
φpure
a ≡asR
(pure
a)asR
φ<*>
asR
ψ ≡asR
(φ<*>
ψ)return
a ≡asR
(return
a)asR
φ>>=
asR
. k ≡asR
(φ>>=
k)filtering
p (asR
φ) ≡asR
(filtering
p φ)interspersing
a (asR
φ) ≡asR
(interspersing
a φ)
class (AsRM p, AsL1' p) => AsL' p whereSource
asL'
is a folding homomorphism to a strict left folding
run
xs (asL'
φ) ≡run
xs φprefix
xs (asL'
φ) ≡asL'
(prefix
xs φ)prefixOf
l xs (asL'
φ) ≡asL'
(prefixOf
l xs φ)postfix
(asL'
φ) xs ≡asL'
(postfix
φ xs)postfixOf
l (asL'
φ) xs ≡asL'
(postfixOf
l φ xs)left'
(asL'
φ) ≡asL'
(left'
φ)right'
(asL'
φ) ≡asL'
(right'
φ)dimap
l r (asL'
φ) ≡asL'
(dimap
l r φ)extract
(asL'
φ) ≡extract
φpure
a ≡asL'
(pure
a)asL'
φ<*>
asL'
ψ ≡asL'
(φ<*>
ψ)return
a ≡asL'
(return
a)asL'
φ>>=
asL'
. k ≡asL'
(φ>>=
k)filtering
p (asL'
φ) ≡asL'
(filtering
p φ)interspersing
a (asL'
φ) ≡asL'
(interspersing
a φ)