| Copyright | (C) 2026 - Eitan Chatav |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | Eitan Chatav <eitan.chatav@gmail.com> |
| Stability | provisional |
| Portability | non-portable |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Data.Profunctor.Monoidal
Description
Synopsis
- type Monoidal p = (Profunctor p, forall x. Applicative (p x))
- oneP :: Monoidal p => p () ()
- (>*<) :: Monoidal p => p a b -> p c d -> p (a, c) (b, d)
- (>*) :: Monoidal p => p () c -> p a b -> p a b
- (*<) :: Monoidal p => p a b -> p () c -> p a b
- dimap2 :: Monoidal p => (s -> a) -> (s -> c) -> (b -> d -> t) -> p a b -> p c d -> p s t
- foreverP :: Monoidal p => p () c -> p a b
- ditraverse :: (Traversable t, Distributive t, Monoidal p) => p a b -> p (t a) (t b)
- replicateP :: (Monoidal p, Choice p, AsEmpty s, AsEmpty t, Cons s t a b) => Int -> p a b -> p s t
- (>:<) :: (Cons s t a b, Monoidal p, Choice p) => p a b -> p s t -> p s t
- asEmpty :: (AsEmpty s, Monoidal p, Choice p) => p s s
- meander :: (Monoidal p, Choice p) => ATraversal s t a b -> p a b -> p s t
- eotFunList :: Iso (Bazaar (->) a1 b1 t1) (Bazaar (->) a2 b2 t2) (Either t1 (a1, Bazaar (->) a1 b1 (b1 -> t1))) (Either t2 (a2, Bazaar (->) a2 b2 (b2 -> t2)))
Monoidal
type Monoidal p = (Profunctor p, forall x. Applicative (p x)) Source #
A lax Monoidal product Profunctor has unit oneP
and product >*< lax monoidal structure morphisms.
This is equivalent to the Profunctor also being Applicative.
Laws:
>>>let lunit = dimap (\((),a) -> a) (\a -> ((),a))>>>let runit = dimap (\(a,()) -> a) (\a -> (a,()))>>>let assoc = dimap (\(a,(b,c)) -> ((a,b),c)) (\((a,b),c) -> (a,(b,c)))
oneP >*< p = lunit p
p >*< oneP = runit p
p >*< q >*< r = assoc ((p >*< q) >*< r)
dimap (f >*< g) (h >*< i) (p >*< q) = dimap f h p >*< dimap g i q
(>*<) :: Monoidal p => p a b -> p c d -> p (a, c) (b, d) infixr 5 Source #
>*< is the product of a Monoidal Profunctor.
ditraverse :: (Traversable t, Distributive t, Monoidal p) => p a b -> p (t a) (t b) Source #
Thanks to Fy on Monoidal Café Discord.
A Traversable & Distributive type
is a homogeneous countable product.
That means it is a static length container, so unlike replicateP,
ditraverse does not need an Int argument.
Monoidal & Choice
replicateP :: (Monoidal p, Choice p, AsEmpty s, AsEmpty t, Cons s t a b) => Int -> p a b -> p s t Source #
replicateP is analagous to replicateM,
for Monoidal & Choice Profunctors.
meander :: (Monoidal p, Choice p) => ATraversal s t a b -> p a b -> p s t Source #
For any Monoidal, Choice & Strong Profunctor,
meander is invertible and gives a default implementation for the
wander
method of Traversing,
though Strong is not needed for its definition.
See Pickering, Gibbons & Wu, Profunctor Optics - Modular Data Accessors
eotFunList :: Iso (Bazaar (->) a1 b1 t1) (Bazaar (->) a2 b2 t2) (Either t1 (a1, Bazaar (->) a1 b1 (b1 -> t1))) (Either t2 (a2, Bazaar (->) a2 b2 (b2 -> t2))) Source #
eotFunList is used to define meander.
See van Laarhoven, A non-regular data type challenge,
both post and comments, for details.
Orphan instances
| Arrow p => Profunctor (WrappedArrow p) Source # | |
Methods dimap :: (a -> b) -> (c -> d) -> WrappedArrow p b c -> WrappedArrow p a d # lmap :: (a -> b) -> WrappedArrow p b c -> WrappedArrow p a c # rmap :: (b -> c) -> WrappedArrow p a b -> WrappedArrow p a c # (#.) :: forall a b c q. Coercible c b => q b c -> WrappedArrow p a b -> WrappedArrow p a c # (.#) :: forall a b c q. Coercible b a => WrappedArrow p b c -> q a b -> WrappedArrow p a c # | |
| (Profunctor p, Alternative (p a)) => Alternative (Coyoneda p a) Source # | |
| (Profunctor p, Alternative (p a)) => Alternative (Yoneda p a) Source # | |
| (Profunctor p, Applicative (p a)) => Applicative (Coyoneda p a) Source # | |
Methods pure :: a0 -> Coyoneda p a a0 # (<*>) :: Coyoneda p a (a0 -> b) -> Coyoneda p a a0 -> Coyoneda p a b # liftA2 :: (a0 -> b -> c) -> Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a c # (*>) :: Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a b # (<*) :: Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a a0 # | |
| (Profunctor p, Applicative (p a)) => Applicative (Yoneda p a) Source # | |
| (Closed p, Distributive f) => Closed (WrappedPafb f p) Source # | |
Methods closed :: WrappedPafb f p a b -> WrappedPafb f p (x -> a) (x -> b) # | |
| (Profunctor p, Alternative (p a), Applicative f) => Alternative (WrappedPafb f p a) Source # | |
Methods empty :: WrappedPafb f p a a0 # (<|>) :: WrappedPafb f p a a0 -> WrappedPafb f p a a0 -> WrappedPafb f p a a0 # some :: WrappedPafb f p a a0 -> WrappedPafb f p a [a0] # many :: WrappedPafb f p a a0 -> WrappedPafb f p a [a0] # | |
| (Profunctor p, Applicative (p a), Applicative f) => Applicative (WrappedPafb f p a) Source # | |
Methods pure :: a0 -> WrappedPafb f p a a0 # (<*>) :: WrappedPafb f p a (a0 -> b) -> WrappedPafb f p a a0 -> WrappedPafb f p a b # liftA2 :: (a0 -> b -> c) -> WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a c # (*>) :: WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a b # (<*) :: WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a a0 # | |
| Monoid r => Applicative (Forget r a :: Type -> Type) Source # | |
| Decidable f => Applicative (Clown f a :: Type -> Type) Source # | |
| Applicative f => Applicative (Joker f a) Source # | |
| Arrow p => Applicative (WrappedArrow p a) Source # | |
Methods pure :: a0 -> WrappedArrow p a a0 # (<*>) :: WrappedArrow p a (a0 -> b) -> WrappedArrow p a a0 -> WrappedArrow p a b # liftA2 :: (a0 -> b -> c) -> WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a c # (*>) :: WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a b # (<*) :: WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a a0 # | |
| Arrow p => Functor (WrappedArrow p a) Source # | |
Methods fmap :: (a0 -> b) -> WrappedArrow p a a0 -> WrappedArrow p a b # (<$) :: a0 -> WrappedArrow p a b -> WrappedArrow p a a0 # | |
| (Monoidal p, Monoidal q) => Applicative (Product p q a) Source # | |
Methods pure :: a0 -> Product p q a a0 # (<*>) :: Product p q a (a0 -> b) -> Product p q a a0 -> Product p q a b # liftA2 :: (a0 -> b -> c) -> Product p q a a0 -> Product p q a b -> Product p q a c # (*>) :: Product p q a a0 -> Product p q a b -> Product p q a b # (<*) :: Product p q a a0 -> Product p q a b -> Product p q a a0 # | |
| (Applicative f, Applicative (p a)) => Applicative (Cayley f p a) Source # | |
Methods pure :: a0 -> Cayley f p a a0 # (<*>) :: Cayley f p a (a0 -> b) -> Cayley f p a a0 -> Cayley f p a b # liftA2 :: (a0 -> b -> c) -> Cayley f p a a0 -> Cayley f p a b -> Cayley f p a c # (*>) :: Cayley f p a a0 -> Cayley f p a b -> Cayley f p a b # (<*) :: Cayley f p a a0 -> Cayley f p a b -> Cayley f p a a0 # | |
| (Monoidal p, Applicative (q a)) => Applicative (Procompose p q a) Source # | |
Methods pure :: a0 -> Procompose p q a a0 # (<*>) :: Procompose p q a (a0 -> b) -> Procompose p q a a0 -> Procompose p q a b # liftA2 :: (a0 -> b -> c) -> Procompose p q a a0 -> Procompose p q a b -> Procompose p q a c # (*>) :: Procompose p q a a0 -> Procompose p q a b -> Procompose p q a b # (<*) :: Procompose p q a a0 -> Procompose p q a b -> Procompose p q a a0 # | |
| (Functor f, Functor (p a)) => Functor (Cayley f p a) Source # | |