Copyright | (c) Justin Le 2019 |
---|---|
License | BSD3 |
Maintainer | justin@jle.im |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Functor combinators and tools (typeclasses and utiility functions) to manipulate them. This is the main "entrypoint" of the library.
Classes include:
HFunctor
andHBifunctor
, used to swap out the functors that the combinators modifyInterpret
,Associative
,Monoidal
, used to inject and interpret functor values with respect to their combinators.
We have some helpful utility functions, as well, built on top of these typeclasses.
The second half of this module exports the various useful functor combinators that can modify functors to add extra functionality, or join two functors together and mix them in different ways. Use them to build your final structure by combining simpler ones in composable ways!
See https://blog.jle.im/entry/functor-combinatorpedia.html and the README for a tutorial and a rundown on each different functor combinator.
Synopsis
- type (~>) (f :: k -> Type) (g :: k -> Type) = forall (x :: k). f x -> g x
- type (<~>) f g = forall p a. Profunctor p => p (g a) (g a) -> p (f a) (f a)
- class HFunctor t where
- class HFunctor t => Inject t where
- class Inject t => Interpret t where
- forI :: (Interpret t, C t g) => t f a -> (f ~> g) -> g a
- getI :: (Interpret t, C t (Const b)) => (forall x. f x -> b) -> t f a -> b
- collectI :: (Interpret t, C t (Const [b])) => (forall x. f x -> b) -> t f a -> [b]
- class HBifunctor t where
- class HBifunctor t => Associative t where
- associating :: (Functor f, Functor g, Functor h) => t f (t g h) <~> t (t f g) h
- class (Associative t, Interpret (SF t)) => Semigroupoidal t where
- type CS t = C (SF t)
- biget :: (Semigroupoidal t, CS t (Const b)) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> b
- bicollect :: (Semigroupoidal t, CS t (Const [b])) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> [b]
- (!*!) :: (Semigroupoidal t, CS t h) => (f ~> h) -> (g ~> h) -> t f g ~> h
- (!$!) :: (Semigroupoidal t, CS t (Const b)) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> b
- class Associative t => Tensor t where
- class (Tensor t, Semigroupoidal t, Interpret (MF t)) => Monoidal t where
- type CM t = C (MF t)
- nilMF :: forall t f. Monoidal t => I t ~> MF t f
- consMF :: Monoidal t => t f (MF t f) ~> MF t f
- inL :: forall t f g. (Monoidal t, CM t g) => f ~> t f g
- inR :: forall t f g. (Monoidal t, CM t f) => g ~> t f g
- outL :: (Tensor t, I t ~ Proxy, Functor f) => t f g ~> f
- outR :: (Tensor t, I t ~ Proxy, Functor g) => t f g ~> g
- data Coyoneda (f :: Type -> Type) a where
- newtype ListF f a = ListF {
- runListF :: [f a]
- newtype NonEmptyF f a where
- NonEmptyF {
- runNonEmptyF :: NonEmpty (f a)
- pattern ProdNonEmpty :: (f :*: ListF f) a -> NonEmptyF f a
- NonEmptyF {
- newtype MaybeF f a = MaybeF {}
- newtype MapF k f a = MapF {}
- newtype NEMapF k f a = NEMapF {}
- data Ap (f :: Type -> Type) a
- data Ap1 :: (Type -> Type) -> Type -> Type where
- data Alt (f :: Type -> Type) a
- data Free f a
- data Free1 f a
- data Lift (f :: Type -> Type) a
- data Step f a = Step {}
- newtype Steps f a = Steps {}
- data ProxyF f a = ProxyF
- data ConstF e f a = ConstF {
- getConstF :: e
- data EnvT e (w :: Type -> Type) a = EnvT e (w a)
- newtype ReaderT r (m :: k -> Type) (a :: k) :: forall k. Type -> (k -> Type) -> k -> Type = ReaderT {
- runReaderT :: r -> m a
- data Flagged f a = Flagged {
- flaggedFlag :: Bool
- flaggedVal :: f a
- newtype IdentityT (f :: k -> Type) (a :: k) :: forall k. (k -> Type) -> k -> Type = IdentityT {
- runIdentityT :: f a
- data Void2 a b
- newtype Final c f a = Final {
- runFinal :: forall g. c g => (forall x. f x -> g x) -> g a
- class Interpret t => FreeOf c t | t -> c where
- newtype ComposeT (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a = ComposeT {
- getComposeT :: f (g m) a
- data Day (f :: Type -> Type) (g :: Type -> Type) a where
- data ((f :: k -> Type) :*: (g :: k -> Type)) (p :: k) :: forall k. (k -> Type) -> (k -> Type) -> k -> Type = (f p) :*: (g p)
- prodOutL :: (f :*: g) ~> f
- prodOutR :: (f :*: g) ~> g
- data ((f :: k -> Type) :+: (g :: k -> Type)) (p :: k) :: forall k. (k -> Type) -> (k -> Type) -> k -> Type
- data V1 (p :: k) :: forall k. k -> Type
- data These1 (f :: Type -> Type) (g :: Type -> Type) a
- data Comp f g a where
- newtype LeftF f g a = LeftF {
- runLeftF :: f a
- newtype RightF f g a = RightF {
- runRightF :: g a
- data HLift t f a
- data HFree t f a
- generalize :: Applicative f => Identity ~> f
- absorb :: f ~> Proxy
Classes
A lot of type signatures are stated in terms of ~>
. ~>
represents a "natural transformation" between two functors: a value of
type f
is a value of type 'f a -> g a~>
g that works for any
a@.
type (~>) (f :: k -> Type) (g :: k -> Type) = forall (x :: k). f x -> g x infixr 0 #
A natural transformation from f
to g
.
type (<~>) f g = forall p a. Profunctor p => p (g a) (g a) -> p (f a) (f a) infixr 0 Source #
The type of an isomorphism between two functors. f
means that
<~>
gf
and g
are isomorphic to each other.
We can effectively use an f <~> g
with:
viewF
:: (f <~> g) -> f a -> g areviewF
:: (f <~> g) -> g a -> a a
Use viewF
to extract the "f
to g
" function, and reviewF
to
extract the "g
to f
" function. Reviewing and viewing the same value
(or vice versa) leaves the value unchanged.
One nice thing is that we can compose isomorphisms using .
from
Prelude:
(.
) :: f <~> g
-> g <~> h
-> f <~> h
Another nice thing about this representation is that we have the
"identity" isomorphism by using id
from Prelude.
id
:: f<~>
g
As a convention, most isomorphisms have form "X-ing", where the forwards function is "ing". For example, we have:
splittingSF
::Monoidal
t =>SF
t a<~>
t f (MF
t f)splitSF
:: Monoidal t => SF t a~>
t f (MF t f)
Single Functors
Classes that deal with single-functor combinators, that enhance a single functor.
class HFunctor t where Source #
An HFunctor
can be thought of a unary "functor transformer" ---
a basic functor combinator. It takes a functor as input and returns
a functor as output.
It "enhances" a functor with extra structure (sort of like how a monad
transformer enhances a Monad
with extra structure).
As a uniform inteface, we can "swap the underlying functor" (also
sometimes called "hoisting"). This is what hmap
does: it lets us swap
out the f
in a t f
for a t g
.
For example, the free monad Free
takes a Functor
and returns a new
Functor
. In the process, it provides a monadic structure over f
.
hmap
lets us turn a
into a Free
f
: a monad built over
Free
gf
can be turned into a monad built over g
.
For the ability to move in and out of the enhanced functor, see
Inject
and Interpret
.
This class is similar to MFunctor
from
Control.Monad.Morph, but instances must work without a Monad
constraint.
This class is also found in the hschema library with the same name.
hmap :: (f ~> g) -> t f ~> t g Source #
If we can turn an f
into a g
, then we can turn a t f
into
a t g
.
It must be the case that
hmap
id
== id
Essentially, t f
adds some "extra structure" to f
. hmap
must swap out the functor, without affecting the added structure.
For example,
is essentially a list of ListF
f af a
s. If we
hmap
to swap out the f a
s for g a
s, then we must ensure that
the "added structure" (here, the number of items in the list, and
the ordering of those items) remains the same. So, hmap
must
preserve the number of items in the list, and must maintain the
ordering.
The law
is a way of formalizing this property.hmap
id
== id
Instances
class HFunctor t => Inject t where Source #
A typeclass for HFunctor
s where you can "inject" an f a
into a t
f a
:
inject
:: f a -> t f a
If you think of t f a
as an "enhanced f
", then inject
allows you
to use an f
as its enhanced form.
With the exception of directly pattern matching on the result, inject
itself is not too useful in the general case without
Interpret
to allow us to interpret or retrieve
back the f
.
Lift from f
into the enhanced t f
structure. Analogous to
lift
from MonadTrans
.
Note that this lets us "lift" a f a
; if you want to lift an a
with a -> t f a
, check if t f
is an instance of Applicative
or
Pointed
.
Instances
class Inject t => Interpret t where Source #
An Interpret
lets us move in and out of the "enhanced" Functor
.
For example,
is Free
ff
enhanced with monadic structure. We get:
inject
:: f a ->Free
f ainterpret
::Monad
m => (forall x. f x -> m x) ->Free
f a -> m a
inject
will let us use our f
inside the enhanced
.
Free
finterpret
will let us "extract" the f
from a
if
we can give an interpreting function that interprets Free
ff
into some
target Monad
.
The type family C
tells us the typeclass constraint of the "target"
functor. For Free
, it is Monad
, but for other Interpret
instances, we might have other constraints.
We enforce that:
interpret
id .inject
== id -- orretract
.inject
== id
That is, if we lift a value into our structure, then immediately interpret it out as itself, it should lave the value unchanged.
retract :: C t f => t f ~> f Source #
Remove the f
out of the enhanced t f
structure, provided that
f
satisfies the necessary constraints. If it doesn't, it needs to
be properly interpret
ed out.
interpret :: C t g => (f ~> g) -> t f ~> g Source #
Given an "interpeting function" from f
to g
, interpret the f
out of the t f
into a final context g
.
Instances
Interpret Ap Source # | A free |
Interpret Ap Source # | A free |
Interpret Ap Source # | A free |
Interpret Alt Source # | A free |
Interpret Coyoneda Source # | A free |
Interpret WrappedApplicative Source # | |
Defined in Data.HFunctor.Interpret type C WrappedApplicative :: (Type -> Type) -> Constraint Source # retract :: C WrappedApplicative f => WrappedApplicative f ~> f Source # interpret :: C WrappedApplicative g => (f ~> g) -> WrappedApplicative f ~> g Source # | |
Interpret MaybeApply Source # | A free |
Defined in Data.HFunctor.Interpret type C MaybeApply :: (Type -> Type) -> Constraint Source # retract :: C MaybeApply f => MaybeApply f ~> f Source # interpret :: C MaybeApply g => (f ~> g) -> MaybeApply f ~> g Source # | |
Interpret Lift Source # | A free |
Interpret ListF Source # | A free |
Interpret NonEmptyF Source # | A free |
Interpret MaybeF Source # | Technically, |
Interpret Free1 Source # | A free |
Interpret Free Source # | A free |
Interpret Ap1 Source # | |
Monoid e => Interpret (EnvT e) Source # | |
Interpret (IdentityT :: (Type -> Type) -> Type -> Type) Source # | A free |
Interpret (These1 f) Source # | Technically, |
Interpret (Reverse :: (Type -> Type) -> Type -> Type) Source # | |
Interpret (Backwards :: (Type -> Type) -> Type -> Type) Source # | |
Monoid k => Interpret (MapF k) Source # | |
Monoid k => Interpret (NEMapF k) Source # | |
Interpret (Step :: (Type -> Type) -> Type -> Type) Source # | |
Interpret (Steps :: (Type -> Type) -> Type -> Type) Source # | |
Interpret (Flagged :: (Type -> Type) -> Type -> Type) Source # | |
Interpret (Final c) Source # | |
Interpret ((:+:) f) Source # | Technically, |
Plus f => Interpret ((:*:) f) Source # | |
Plus f => Interpret (Product f) Source # | |
Interpret (Sum f) Source # | Technically, |
(Interpret s, Interpret t) => Interpret (ComposeT s t) Source # | |
Interpret (ReaderT r :: (Type -> Type) -> Type -> Type) Source # | A free |
Interpret (ProxyF :: (Type -> Type) -> Type -> Type) Source # | The only way for this to obey |
Interpret t => Interpret (HFree t) Source # | Never uses |
Interpret t => Interpret (HLift t) Source # | Never uses |
(HBifunctor t, Semigroupoidal t) => Interpret (Chain1 t) Source # | |
Interpret (M1 i c :: (Type -> Type) -> Type -> Type) Source # | |
Monoid e => Interpret (ConstF e :: (Type -> Type) -> Type -> Type) Source # | The only way for this to obey |
Interpret (RightF f :: (Type -> Type) -> Type -> Type) Source # | |
(Monoidal t, i ~ I t) => Interpret (Chain t i) Source # | We can collapse and interpret an |
forI :: (Interpret t, C t g) => t f a -> (f ~> g) -> g a Source #
A convenient flipped version of interpret
.
getI :: (Interpret t, C t (Const b)) => (forall x. f x -> b) -> t f a -> b Source #
Useful wrapper over interpret
to allow you to directly extract
a value b
out of the t f a
, if you can convert f x
into b
.
Note that depending on the constraints on the interpretation of t
, you
may have extra constraints on b
.
- If
isC
tUnconstrained
, there are no constraints onb
- If
isC
tApply
,b
needs to be an instance ofSemigroup
- If
isC
tApplicative
,b
needs to be an instance ofMonoid
For some constraints (like Monad
), this will not be usable.
-- get the length of theMap String
in theStep
.collectI
length :: Step (Map String) Bool -> Int
collectI :: (Interpret t, C t (Const [b])) => (forall x. f x -> b) -> t f a -> [b] Source #
Useful wrapper over getI
to allow you to collect a b
from all
instances of f
inside a t f a
.
This will work if
is C
tUnconstrained
, Apply
, or Applicative
.
-- get the lengths of allMap String
s in theAp
.collectI
length :: Ap (Map String) Bool -> [Int]
Multi-Functors
Classes that deal with two-functor combinators, that "mix" two functors together in some way.
class HBifunctor t where Source #
A HBifunctor
is like an HFunctor
, but it enhances two different
functors instead of just one.
Usually, it enhaces them "together" in some sort of combining way.
This typeclass provides a uniform instance for "swapping out" or
"hoisting" the enhanced functors. We can hoist the first one with
hleft
, the second one with hright
, or both at the same time with
hbimap
.
For example, the f :*: g
type gives us "both f
and g
":
data (f :*:
g) a = f a :*: g a
It combines both f
and g
into a unified structure --- here, it does
it by providing both f
and g
.
The single law is:
hbimap
id
id == id
This ensures that hleft
, hright
, and hbimap
do not affect the
structure that t
adds on top of the underlying functors.
hleft :: (f ~> j) -> t f g ~> t j g Source #
Swap out the first transformed functor.
hright :: (g ~> k) -> t f g ~> t f k Source #
Swap out the second transformed functor.
hbimap :: (f ~> j) -> (g ~> k) -> t f g ~> t j k Source #
Swap out both transformed functors at the same time.
Instances
HBifunctor (Sum :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HBifunctor ((:+:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HBifunctor (Product :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HBifunctor ((:*:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HBifunctor (Joker :: (k2 -> Type) -> (k1 -> Type) -> k2 -> Type) Source # | |
HBifunctor (LeftF :: (k2 -> Type) -> (k1 -> Type) -> k2 -> Type) Source # | |
HBifunctor (RightF :: (k1 -> Type) -> (k2 -> Type) -> k2 -> Type) Source # | |
HBifunctor (Void3 :: (k1 -> Type) -> (k2 -> Type) -> k3 -> Type) Source # | |
HBifunctor Day Source # | |
HBifunctor These1 Source # | |
HBifunctor Comp Source # | |
Associative
class HBifunctor t => Associative t where Source #
An HBifunctor
where it doesn't matter which binds first is
Associative
. Knowing this gives us a lot of power to rearrange the
internals of our HFunctor
at will.
For example, for the functor product:
data (f :*:
g) a = f a :*: g a
We know that f :*: (g :*: h)
is the same as (f :*: g) :*: h
.
Instances
Associative Day Source # | |
Associative These1 Source # | |
Associative Comp Source # | |
Associative ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (Product :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (Sum :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (Joker :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (RightF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Associative (Void3 :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
class (Associative t, Interpret (SF t)) => Semigroupoidal t where Source #
For some t
s, you can represent the act of applying a functor f
to
t
many times, as a single type. That is, there is some type
that is equivalent to one of:SF
t f
f a
-- 1 timet f f a
-- 2 timest f (t f f) a
-- 3 timest f (t f (t f f)) a
-- 4 timest f (t f (t f (t f f))) a
-- 5 times- .. etc
This typeclass associates each t
with its "induced semigroupoidal
functor combinator"
.SF
t
This is useful because sometimes you might want to describe a type that
can be t f f
, t f (t f f)
, t f (t f (t f f))
, etc.; "f applied to
itself", with at least one f
. This typeclass lets you use a type like
NonEmptyF
in terms of repeated applications of :*:
, or Ap1
in
terms of repeated applications of Day
, or Free1
in terms of repeated
applications of Comp
, etc.
For example, f
can be interpreted as "a free selection of two
:*:
ff
s", allowing you to specify "I have to f
s that I can use". If you
want to specify "I want 1, 2, or many different f
s that I can use",
you can use
.NonEmptyF
f
At the high level, the main way to use a Semigroupoidal
is with
biretract
and binterpret
:
biretract
:: t f f~>
fbinterpret
:: (f ~> h) -> (g ~> h) -> t f g ~> h
which are like the HBifunctor
versions of retract
and interpret
:
they fully "mix" together the two inputs of t
.
Also useful is:
toSF
:: t f f a -> SF t f a
Which converts a t
into its aggregate type SF
.
In reality, most Semigroupoidal
instances are also
Monoidal
instances, so you can think of the
separation as mostly to help organize functionality. However, there are
two non-monoidal semigroupoidal instances of note: LeftF
and RightF
,
which are higher order analogues of the First
and
Last
semigroups, roughly.
type SF t :: (Type -> Type) -> Type -> Type Source #
The "semigroup functor combinator" generated by t
.
A value of type SF t f a
is equivalent to one of:
f a
t f f a
t f (t f f) a
t f (t f (t f f)) a
t f (t f (t f (t f f))) a
- .. etc
For example, for :*:
, we have NonEmptyF
. This is because:
x ~NonEmptyF
(x:|
[]) ~inject
x x:*:
y ~ NonEmptyF (x :| [y]) ~toSF
(x :*: y) x :*: y :*: z ~ NonEmptyF (x :| [y,z]) -- etc.
You can create an "singleton" one with inject
, or else one from
a single t f f
with toSF
.
appendSF :: t (SF t f) (SF t f) ~> SF t f Source #
If a
represents multiple applications of SF
t ft f
to
itself, then we can also "append" two
s applied to
themselves into one giant SF
t f
containing all of the SF
t ft f
s.
consSF :: t f (SF t f) ~> SF t f Source #
Prepend an application of t f
to the front of a
.SF
t f
toSF :: t f f ~> SF t f Source #
Embed a direct application of f
to itself into a
.SF
t f
biretract :: CS t f => t f f ~> f Source #
The HBifunctor
analogy of retract
. It retracts both f
s
into a single f
, effectively fully mixing them together.
binterpret :: CS t h => (f ~> h) -> (g ~> h) -> t f g ~> h Source #
The HBifunctor
analogy of interpret
. It takes two
interpreting functions, and mixes them together into a target
functor h
.
Instances
Convenient alias for the constraint required for biretract
,
binterpret
, etc.
It's usually a constraint on the target/result context of interpretation
that allows you to "exit" or "run" a
.Semigroupoidal
t
biget :: (Semigroupoidal t, CS t (Const b)) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> b Source #
Useful wrapper over binterpret
to allow you to directly extract
a value b
out of the t f a
, if you can convert f x
into b
.
Note that depending on the constraints on the interpretation of t
, you
may have extra constraints on b
.
- If
isC
(SF
t)Unconstrained
, there are no constraints onb
- If
isC
(SF
t)Apply
,b
needs to be an instance ofSemigroup
- If
isC
(SF
t)Applicative
,b
needs to be an instance ofMonoid
For some constraints (like Monad
), this will not be usable.
-- Return the length of either the list, or the Map, depending on which -- one s in the+
biget
length
length :: ([] :+:Map
Int
)Char
-> Int -- Return the length of both the list and the map, added togetherbiget
(Sum
. length) (Sum . length) ::Day
[] (Map Int) Char -> Sum Int
bicollect :: (Semigroupoidal t, CS t (Const [b])) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> [b] Source #
Useful wrapper over biget
to allow you to collect a b
from all
instances of f
and g
inside a t f g a
.
This will work if
is C
tUnconstrained
,
Apply
, or Applicative
.
(!*!) :: (Semigroupoidal t, CS t h) => (f ~> h) -> (g ~> h) -> t f g ~> h infixr 5 Source #
Infix alias for binterpret
(!$!) :: (Semigroupoidal t, CS t (Const b)) => (forall x. f x -> b) -> (forall x. g x -> b) -> t f g a -> b infixr 5 Source #
Tensor
class Associative t => Tensor t where Source #
An Associative
HBifunctor
can be a Tensor
if there is some
identity i
where t i f
is equivalent to just f
.
That is, "enhancing" f
with t i
does nothing.
The methods in this class provide us useful ways of navigating
a
with respect to this property.Tensor
t
The Tensor
is essentially the HBifunctor
equivalent of Inject
,
with intro1
and intro2
taking the place of inject
.
type I t :: Type -> Type Source #
The identity of
. If you "combine" Tensor
tf
with the
identity, it leaves f
unchanged.
For example, the identity of :*:
is Proxy
. This is because
(Proxy
:*: f) a
is equivalent to just
f a
:*:
-ing f
with Proxy
gives you no additional structure.
Another example:
(V1
:+:
f) a
is equivalent to just
f a
because the L1
case is unconstructable.
intro1 :: f ~> t f (I t) Source #
Because t f (I t)
is equivalent to f
, we can always "insert"
f
into t f (I t)
.
This is analogous to inject
from Inject
, but for HBifunctor
s.
intro2 :: g ~> t (I t) g Source #
Because t (I t) g
is equivalent to f
, we can always "insert"
g
into t (I t) g
.
This is analogous to inject
from Inject
, but for HBifunctor
s.
Instances
Tensor Day Source # | |
Tensor These1 Source # | |
Tensor Comp Source # | |
Tensor ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Tensor ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Tensor (Product :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Tensor (Sum :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
class (Tensor t, Semigroupoidal t, Interpret (MF t)) => Monoidal t where Source #
A
is a Monoidal
tSemigroupoidal
, in that it provides some type
that is equivalent to one of:MF
t f
I a
-- 0 timesf a
-- 1 timet f f a
-- 2 timest f (t f f) a
-- 3 timest f (t f (t f f)) a
-- 4 timest f (t f (t f (t f f))) a
-- 5 times- .. etc
The difference is that unlike
, SF
t
has the "zero times"
value.MF
t
This typeclass lets you use a type like ListF
in terms of repeated
applications of :*:
, or Ap
in terms of repeated applications of
Day
, or Free
in terms of repeated applications of Comp
, etc.
For example, f
can be interpreted as "a free selection of two
:*:
ff
s", allowing you to specify "I have to f
s that I can use". If you
want to specify "I want 0, 1, or many different f
s that I can use",
you can use
.ListF
f
At the high level, the thing that Monoidal
adds to Semigroupoidal
is inL
, inR
, and nilMF
:
inL
:: f a -> t f g ainR
:: g a -> t f g anilMF
:: I a -> MF t f a
which are like the HBifunctor
versions of inject
: it lets you inject
an f
into t f g
, so you can start doing useful mixing operations
with it. nilMF
lets you construct an "empty"
.MF
t
Also useful is:
toMF
:: t f f a -> MF t f a
Which converts a t
into its aggregate type MF
type MF t :: (Type -> Type) -> Type -> Type Source #
The "monoidal functor combinator" induced by t
.
A value of type MF t f a
is equivalent to one of:
I a
-- zero fsf a
-- one ft f f a
-- two fst f (t f f) a
-- three fst f (t f (t f f)) a
t f (t f (t f (t f f))) a
- .. etc
For example, for :*:
, we have ListF
. This is because:
Proxy
~ListF
[] ~nilMF
@(:*:
) x ~ ListF [x] ~inject
x x :*: y ~ ListF [x,y] ~toMF
(x :*: y) x :*: y :*: z ~ ListF [x,y,z] -- etc.
You can create an "empty" one with nilMF
, a "singleton" one with
inject
, or else one from a single t f f
with toMF
.
appendMF :: t (MF t f) (MF t f) ~> MF t f Source #
If a
represents multiple applications of MF
t ft f
to
itself, then we can also "append" two
s applied to
themselves into one giant MF
t f
containing all of the MF
t ft f
s.
splitSF :: SF t f ~> t f (MF t f) Source #
Lets you convert an
into a single application of SF
t ff
to
.MF
t f
Analogous to a function NonEmpty
a -> (a,
[a])
Note that this is not reversible in general unless we have
.Matchable
t
toMF :: t f f ~> MF t f Source #
Embed a direct application of f
to itself into a
.MF
t f
fromSF :: SF t f ~> MF t f Source #
is "one or more SF
t ff
s", and 'MF t f
is "zero or more
f
s". This function lets us convert from one to the other.
This is analogous to a function
.NonEmpty
a ->
[a]
Note that because t
is not inferrable from the input or output
type, you should call this using -XTypeApplications:
fromSF
@(:*:
) ::NonEmptyF
f a ->ListF
f a fromSF @Comp
::Free1
f a ->Free
f a
pureT :: CM t f => I t ~> f Source #
If we have an
, we can generate an I
tf
based on how it
interacts with t
.
Specialized (and simplified), this type is:
pureT
@Day
::Applicative
f =>Identity
a -> f a --pure
pureT @Comp
::Monad
f => Identity a -> f a --return
pureT @(:*:
) ::Plus
f =>Proxy
a -> f a --zero
Note that because t
appears nowhere in the input or output types,
you must always use this with explicit type application syntax (like
pureT @Day
)
upgradeC :: CM t f => proxy f -> (CS t f => r) -> r Source #
If we have a constraint on the Monoidal
satisfied, it should
also imply the constraint on the Semigroupoidal
.
This is basically saying that
should be a superclass
of C
(SF
t)
.C
(MF
t)
For example, for :*:
, this type signature says that Alt
is
a superclass of Plus
, so whenever you have Plus
, you should
always also have Alt
.
For Day
, this type signature says that Apply
is a superclass of
Applicative
, so whenever you have Applicative
, you should always
also have Apply
.
This is necessary because in the current class hierarchy, Apply
isn't a true superclass of Applicative
. upgradeC
basically
"imbues" f
with an Apply
instance based on its Applicative
instance, so things can be easier to use.
For example, let's say I have a type Parser
that is an
Applicative
instance, but the source library does not define an
Apply
instance. I cannot use biretract
or binterpret
with it,
even though I should be able to, because they require Apply
.
That is:
biretract
::Day
Parser Parser a -> Parser a
is a type error, because it requires
.Apply
Parser
But, if we know that Parser
has an Applicative
instance, we can
use:
upgradeC
@Day
(Proxy
@Parser)biretract
:: Day Parser Parser a -> a
and this will now typecheck properly.
Ideally, Parser
would also have an Apply
instance. But we
cannot control this if an external library defines Parser
.
(Alternatively you can just use biretractT
.)
Note that you should only use this if f
doesn't already have the
SF
constraint. If it does, this could lead to conflicting
instances. Only use this with specific, concrete f
s. Otherwise
this is unsafe and can possibly break coherence guarantees.
The proxy
argument can be provided using something like
, to specify which Proxy
@ff
you want to upgrade.
Instances
nilMF :: forall t f. Monoidal t => I t ~> MF t f Source #
Create the "empty MF
@.
If
represents multiple applications of MF
t ft f
with
itself, then nilMF
gives us "zero applications of f
".
Note that t
cannot be inferred from the input or output type of
nilMF
, so this function must always be called with -XTypeApplications:
nilMF
@Day
::Identity
~>
Ap
f nilMF @Comp
:: Identity ~>Free
f nilMF @(:*:
) ::Proxy
~>ListF
f
consMF :: Monoidal t => t f (MF t f) ~> MF t f Source #
Lets us "cons" an application of f
to the front of an
.MF
t f
inL :: forall t f g. (Monoidal t, CM t g) => f ~> t f g Source #
Convenient wrapper over intro1
that lets us introduce an arbitrary
functor g
to the right of an f
.
You can think of this as an HBifunctor
analogue of inject
.
inR :: forall t f g. (Monoidal t, CM t f) => g ~> t f g Source #
Convenient wrapper over intro2
that lets us introduce an arbitrary
functor f
to the right of a g
.
You can think of this as an HBifunctor
analogue of inject
.
Combinators
Functor combinators ** Single
data Coyoneda (f :: Type -> Type) a where #
A covariant Functor
suitable for Yoneda reduction
Instances
A list of f a
s. Can be used to describe a product of many different
values of type f a
.
This is the Free Plus
.
Instances
Interpret ListF Source # | A free |
FreeOf Plus ListF Source # | |
Functor f => Functor (ListF f) Source # | |
Applicative f => Applicative (ListF f) Source # | |
Foldable f => Foldable (ListF f) Source # | |
Defined in Control.Applicative.ListF fold :: Monoid m => ListF f m -> m # foldMap :: Monoid m => (a -> m) -> ListF f a -> m # foldr :: (a -> b -> b) -> b -> ListF f a -> b # foldr' :: (a -> b -> b) -> b -> ListF f a -> b # foldl :: (b -> a -> b) -> b -> ListF f a -> b # foldl' :: (b -> a -> b) -> b -> ListF f a -> b # foldr1 :: (a -> a -> a) -> ListF f a -> a # foldl1 :: (a -> a -> a) -> ListF f a -> a # elem :: Eq a => a -> ListF f a -> Bool # maximum :: Ord a => ListF f a -> a # minimum :: Ord a => ListF f a -> a # | |
Traversable f => Traversable (ListF f) Source # | |
Applicative f => Alternative (ListF f) Source # | |
Eq1 f => Eq1 (ListF f) Source # | |
Ord1 f => Ord1 (ListF f) Source # | |
Defined in Control.Applicative.ListF | |
Read1 f => Read1 (ListF f) Source # | |
Defined in Control.Applicative.ListF | |
Show1 f => Show1 (ListF f) Source # | |
Apply f => Apply (ListF f) Source # | |
Pointed f => Pointed (ListF f) Source # | |
Defined in Control.Applicative.ListF | |
Functor f => Plus (ListF f) Source # | |
Defined in Control.Applicative.ListF | |
Functor f => Alt (ListF f) Source # | |
HBind ListF Source # | |
Inject ListF Source # | |
HFunctor ListF Source # | |
Eq (f a) => Eq (ListF f a) Source # | |
(Typeable f, Typeable a, Data (f a)) => Data (ListF f a) Source # | |
Defined in Control.Applicative.ListF gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ListF f a -> c (ListF f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (ListF f a) # toConstr :: ListF f a -> Constr # dataTypeOf :: ListF f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (ListF f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (ListF f a)) # gmapT :: (forall b. Data b => b -> b) -> ListF f a -> ListF f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ListF f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ListF f a -> r # gmapQ :: (forall d. Data d => d -> u) -> ListF f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> ListF f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> ListF f a -> m (ListF f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ListF f a -> m (ListF f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ListF f a -> m (ListF f a) # | |
Ord (f a) => Ord (ListF f a) Source # | |
Defined in Control.Applicative.ListF | |
Read (f a) => Read (ListF f a) Source # | |
Show (f a) => Show (ListF f a) Source # | |
Generic (ListF f a) Source # | |
Semigroup (ListF f a) Source # | |
Monoid (ListF f a) Source # | |
type C ListF Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (ListF f a) Source # | |
Defined in Control.Applicative.ListF |
newtype NonEmptyF f a Source #
A non-empty list of f a
s. Can be used to describe a product between
many different possible values of type f a
.
Essentially:
NonEmptyF
f ~ f -- one f:+:
(f:*:
f) -- two f's :+: (f :*: f :*: f) -- three f's :+: (f :*: f :*: f :*: f) -- four f's :+: ... -- etc.
This is the Free Plus
.
NonEmptyF | |
|
pattern ProdNonEmpty :: (f :*: ListF f) a -> NonEmptyF f a | Treat a
|
Instances
A maybe f a
.
Can be useful for describing a "an f a
that may or may not be there".
This is the free structure for a "fail"-like typeclass that would only
have zero :: f a
.
Instances
Interpret MaybeF Source # | Technically, |
Functor f => Functor (MaybeF f) Source # | |
Applicative f => Applicative (MaybeF f) Source # | |
Foldable f => Foldable (MaybeF f) Source # | |
Defined in Control.Applicative.ListF fold :: Monoid m => MaybeF f m -> m # foldMap :: Monoid m => (a -> m) -> MaybeF f a -> m # foldr :: (a -> b -> b) -> b -> MaybeF f a -> b # foldr' :: (a -> b -> b) -> b -> MaybeF f a -> b # foldl :: (b -> a -> b) -> b -> MaybeF f a -> b # foldl' :: (b -> a -> b) -> b -> MaybeF f a -> b # foldr1 :: (a -> a -> a) -> MaybeF f a -> a # foldl1 :: (a -> a -> a) -> MaybeF f a -> a # elem :: Eq a => a -> MaybeF f a -> Bool # maximum :: Ord a => MaybeF f a -> a # minimum :: Ord a => MaybeF f a -> a # | |
Traversable f => Traversable (MaybeF f) Source # | |
Defined in Control.Applicative.ListF | |
Applicative f => Alternative (MaybeF f) Source # | |
Eq1 f => Eq1 (MaybeF f) Source # | |
Ord1 f => Ord1 (MaybeF f) Source # | |
Defined in Control.Applicative.ListF | |
Read1 f => Read1 (MaybeF f) Source # | |
Defined in Control.Applicative.ListF | |
Show1 f => Show1 (MaybeF f) Source # | |
Pointed f => Pointed (MaybeF f) Source # | |
Defined in Control.Applicative.ListF | |
Functor f => Plus (MaybeF f) Source # | |
Defined in Control.Applicative.ListF | |
Functor f => Alt (MaybeF f) Source # | |
HBind MaybeF Source # | |
Inject MaybeF Source # | |
HFunctor MaybeF Source # | |
Eq (f a) => Eq (MaybeF f a) Source # | |
(Typeable f, Typeable a, Data (f a)) => Data (MaybeF f a) Source # | |
Defined in Control.Applicative.ListF gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> MaybeF f a -> c (MaybeF f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (MaybeF f a) # toConstr :: MaybeF f a -> Constr # dataTypeOf :: MaybeF f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (MaybeF f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (MaybeF f a)) # gmapT :: (forall b. Data b => b -> b) -> MaybeF f a -> MaybeF f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> MaybeF f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> MaybeF f a -> r # gmapQ :: (forall d. Data d => d -> u) -> MaybeF f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> MaybeF f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> MaybeF f a -> m (MaybeF f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> MaybeF f a -> m (MaybeF f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> MaybeF f a -> m (MaybeF f a) # | |
Ord (f a) => Ord (MaybeF f a) Source # | |
Read (f a) => Read (MaybeF f a) Source # | |
Show (f a) => Show (MaybeF f a) Source # | |
Generic (MaybeF f a) Source # | |
Semigroup (MaybeF f a) Source # | Picks the first |
Monoid (MaybeF f a) Source # | |
type C MaybeF Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (MaybeF f a) Source # | |
Defined in Control.Applicative.ListF |
A map of f a
s, indexed by keys of type k
. It can be useful for
represeting a product of many different values of type f a
, each "at"
a different k
location.
Can be considered a combination of EnvT
and
ListF
, in a way --- a
is like a MapF
k f a
with unique (and ordered)
keys.ListF
(EnvT
k f) a
One use case might be to extend a schema with many "options", indexed by some string.
For example, if you had a command line argument parser for a single command
data Command a
Then you can represent a command line argument parser for multiple named commands with
type Commands =MapF
String
Command
See NEMapF
for a non-empty variant, if you want to enforce that your
bag has at least one f a
.
Instances
Monoid k => Interpret (MapF k) Source # | |
Monoid k => Inject (MapF k :: (Type -> Type) -> Type -> Type) Source # | Injects into a singleton map at |
HFunctor (MapF k :: (Type -> Type) -> Type -> Type) Source # | |
Functor f => Functor (MapF k f) Source # | |
Foldable f => Foldable (MapF k f) Source # | |
Defined in Control.Applicative.ListF fold :: Monoid m => MapF k f m -> m # foldMap :: Monoid m => (a -> m) -> MapF k f a -> m # foldr :: (a -> b -> b) -> b -> MapF k f a -> b # foldr' :: (a -> b -> b) -> b -> MapF k f a -> b # foldl :: (b -> a -> b) -> b -> MapF k f a -> b # foldl' :: (b -> a -> b) -> b -> MapF k f a -> b # foldr1 :: (a -> a -> a) -> MapF k f a -> a # foldl1 :: (a -> a -> a) -> MapF k f a -> a # elem :: Eq a => a -> MapF k f a -> Bool # maximum :: Ord a => MapF k f a -> a # minimum :: Ord a => MapF k f a -> a # | |
Traversable f => Traversable (MapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Eq k, Eq1 f) => Eq1 (MapF k f) Source # | |
(Ord k, Ord1 f) => Ord1 (MapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Ord k, Read k, Read1 f) => Read1 (MapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Show k, Show1 f) => Show1 (MapF k f) Source # | |
(Monoid k, Pointed f) => Pointed (MapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Functor f, Ord k) => Plus (MapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Functor f, Ord k) => Alt (MapF k f) Source # | Left-biased union |
(Eq k, Eq (f a)) => Eq (MapF k f a) Source # | |
(Typeable f, Typeable a, Data k, Data (f a), Ord k) => Data (MapF k f a) Source # | |
Defined in Control.Applicative.ListF gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> MapF k f a -> c (MapF k f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (MapF k f a) # toConstr :: MapF k f a -> Constr # dataTypeOf :: MapF k f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (MapF k f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (MapF k f a)) # gmapT :: (forall b. Data b => b -> b) -> MapF k f a -> MapF k f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> MapF k f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> MapF k f a -> r # gmapQ :: (forall d. Data d => d -> u) -> MapF k f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> MapF k f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> MapF k f a -> m (MapF k f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> MapF k f a -> m (MapF k f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> MapF k f a -> m (MapF k f a) # | |
(Ord k, Ord (f a)) => Ord (MapF k f a) Source # | |
(Ord k, Read k, Read (f a)) => Read (MapF k f a) Source # | |
(Show k, Show (f a)) => Show (MapF k f a) Source # | |
Generic (MapF k f a) Source # | |
(Ord k, Alt f) => Semigroup (MapF k f a) Source # | A union, combining matching keys with |
(Ord k, Alt f) => Monoid (MapF k f a) Source # | |
type C (MapF k) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (MapF k f a) Source # | |
Defined in Control.Applicative.ListF |
A non-empty map of f a
s, indexed by keys of type k
. It can be
useful for represeting a product of many different values of type f a
,
each "at" a different k
location, where you need to have at least one
f a
at all times.
Can be considered a combination of EnvT
and
NonEmptyF
, in a way --- an
is like a NEMapF
k f a
with unique (and ordered)
keys.NonEmptyF
(EnvT
k f) a
See MapF
for some use cases.
Instances
Monoid k => Interpret (NEMapF k) Source # | |
Monoid k => Inject (NEMapF k :: (Type -> Type) -> Type -> Type) Source # | Injects into a singleton map at |
HFunctor (NEMapF k :: (Type -> Type) -> Type -> Type) Source # | |
Functor f => Functor (NEMapF k f) Source # | |
Foldable f => Foldable (NEMapF k f) Source # | |
Defined in Control.Applicative.ListF fold :: Monoid m => NEMapF k f m -> m # foldMap :: Monoid m => (a -> m) -> NEMapF k f a -> m # foldr :: (a -> b -> b) -> b -> NEMapF k f a -> b # foldr' :: (a -> b -> b) -> b -> NEMapF k f a -> b # foldl :: (b -> a -> b) -> b -> NEMapF k f a -> b # foldl' :: (b -> a -> b) -> b -> NEMapF k f a -> b # foldr1 :: (a -> a -> a) -> NEMapF k f a -> a # foldl1 :: (a -> a -> a) -> NEMapF k f a -> a # toList :: NEMapF k f a -> [a] # null :: NEMapF k f a -> Bool # length :: NEMapF k f a -> Int # elem :: Eq a => a -> NEMapF k f a -> Bool # maximum :: Ord a => NEMapF k f a -> a # minimum :: Ord a => NEMapF k f a -> a # | |
Traversable f => Traversable (NEMapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Eq k, Eq1 f) => Eq1 (NEMapF k f) Source # | |
(Ord k, Ord1 f) => Ord1 (NEMapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Ord k, Read k, Read1 f) => Read1 (NEMapF k f) Source # | |
Defined in Control.Applicative.ListF | |
(Show k, Show1 f) => Show1 (NEMapF k f) Source # | |
Foldable1 f => Foldable1 (NEMapF k f) Source # | |
(Monoid k, Pointed f) => Pointed (NEMapF k f) Source # | |
Defined in Control.Applicative.ListF | |
Traversable1 f => Traversable1 (NEMapF k f) Source # | |
(Functor f, Ord k) => Alt (NEMapF k f) Source # | Left-biased union |
(Eq k, Eq (f a)) => Eq (NEMapF k f a) Source # | |
(Typeable f, Typeable a, Data k, Data (f a), Ord k) => Data (NEMapF k f a) Source # | |
Defined in Control.Applicative.ListF gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> NEMapF k f a -> c (NEMapF k f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (NEMapF k f a) # toConstr :: NEMapF k f a -> Constr # dataTypeOf :: NEMapF k f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (NEMapF k f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (NEMapF k f a)) # gmapT :: (forall b. Data b => b -> b) -> NEMapF k f a -> NEMapF k f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> NEMapF k f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> NEMapF k f a -> r # gmapQ :: (forall d. Data d => d -> u) -> NEMapF k f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> NEMapF k f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> NEMapF k f a -> m (NEMapF k f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> NEMapF k f a -> m (NEMapF k f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> NEMapF k f a -> m (NEMapF k f a) # | |
(Ord k, Ord (f a)) => Ord (NEMapF k f a) Source # | |
Defined in Control.Applicative.ListF | |
(Ord k, Read k, Read (f a)) => Read (NEMapF k f a) Source # | |
(Show k, Show (f a)) => Show (NEMapF k f a) Source # | |
Generic (NEMapF k f a) Source # | |
(Ord k, Alt f) => Semigroup (NEMapF k f a) Source # | A union, combining matching keys with |
type C (NEMapF k) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (NEMapF k f a) Source # | |
Defined in Control.Applicative.ListF |
data Ap (f :: Type -> Type) a #
The free Applicative
for a Functor
f
.
data Ap1 :: (Type -> Type) -> Type -> Type where Source #
One or more f
s convolved with itself.
Essentially:
Ap1
f ~ f -- one f:+:
(f `Day'
f) -- two f's :+: (f `Day` f `Day` f) -- three f's :+: (f `Day` f `Day` f `Day` f) -- four f's :+: ... -- etc.
Useful if you want to promote an f
to a situation with "at least one
f
sequenced with itself".
Mostly useful for its HFunctor
and Interpret
instance, along with
its relationship with Ap
and Day
.
This is the free Apply
--- Basically a "non-empty" Ap
.
The construction here is based on Ap
, similar to now
NonEmpty
is built on list.
pattern DayAp1 :: Day f (Ap f) a -> Ap1 f a | An |
data Alt (f :: Type -> Type) a #
Instances
Interpret Alt Source # | A free |
FreeOf Alternative Alt Source # | |
Functor (Alt f) | |
Applicative (Alt f) | |
Alternative (Alt f) | |
Apply (Alt f) | |
Alt (Alt f) | |
HBind Alt Source # | |
Inject Alt Source # | |
HFunctor Alt Source # | |
Semigroup (Alt f a) | |
Monoid (Alt f a) | |
type C Alt Source # | |
Defined in Data.HFunctor.Interpret |
A
is Free
ff
enhanced with "sequential binding" capabilities.
It allows you to sequence multiple f
s one after the other, and also to
determine "what f
to sequence" based on the result of the computation
so far.
Essentially, you can think of this as "giving f
a Monad
instance",
with all that that entails (return
, >>=
, etc.).
Lift f
into it with
. When you finally want to "use" it, you can interpret it into any
monadic context:inject
:: f a -> Free
f a
interpret
::Monad
g => (forall x. f x -> g x) ->Free
f a -> g a
Structurally, this is equivalent to many "nested" f's. A value of type
is either:Free
f a
a
f a
f (f a)
f (f (f a))
- .. etc.
Under the hood, this is the Church-encoded Freer monad. It's
Free
, or F
, but in
a way that is compatible with HFunctor
and
Interpret
.
Instances
The Free Bind
. Imbues any functor f
with a Bind
instance.
Conceptually, this is "Free
without pure". That is, while normally
is an Free
f aa
, a f a
, a f (f a)
, etc., a
is
an Free1
f af a
, f (f a)
, f (f (f a))
, etc. It's a Free
with "at least
one layer of f
", excluding the a
case.
It can be useful as the semigroup formed by :.:
(functor composition):
Sometimes we want an f :.: f
, or an f :.: f :.: f
, or an f :.:
f :.: f :.: f
...just as long as we have at least one f
.
Instances
data Lift (f :: Type -> Type) a #
Applicative functor formed by adding pure computations to a given applicative functor.
Instances
Interpret Lift Source # | A free |
FreeOf Pointed Lift Source # | |
Functor f => Functor (Lift f) | |
Applicative f => Applicative (Lift f) | A combination is |
Foldable f => Foldable (Lift f) | |
Defined in Control.Applicative.Lift fold :: Monoid m => Lift f m -> m # foldMap :: Monoid m => (a -> m) -> Lift f a -> m # foldr :: (a -> b -> b) -> b -> Lift f a -> b # foldr' :: (a -> b -> b) -> b -> Lift f a -> b # foldl :: (b -> a -> b) -> b -> Lift f a -> b # foldl' :: (b -> a -> b) -> b -> Lift f a -> b # foldr1 :: (a -> a -> a) -> Lift f a -> a # foldl1 :: (a -> a -> a) -> Lift f a -> a # elem :: Eq a => a -> Lift f a -> Bool # maximum :: Ord a => Lift f a -> a # minimum :: Ord a => Lift f a -> a # | |
Traversable f => Traversable (Lift f) | |
Alternative f => Alternative (Lift f) | A combination is |
Eq1 f => Eq1 (Lift f) | |
Ord1 f => Ord1 (Lift f) | |
Defined in Control.Applicative.Lift | |
Read1 f => Read1 (Lift f) | |
Defined in Control.Applicative.Lift | |
Show1 f => Show1 (Lift f) | |
Foldable1 f => Foldable1 (Lift f) | |
Apply f => Apply (Lift f) | |
Pointed (Lift f) | |
Defined in Data.Pointed | |
Traversable1 f => Traversable1 (Lift f) | |
Plus f => Plus (Lift f) | |
Defined in Data.Functor.Plus | |
Alt f => Alt (Lift f) | |
HBind Lift Source # | |
Inject Lift Source # | |
HFunctor Lift Source # | |
(Eq1 f, Eq a) => Eq (Lift f a) | |
(Ord1 f, Ord a) => Ord (Lift f a) | |
Defined in Control.Applicative.Lift | |
(Read1 f, Read a) => Read (Lift f a) | |
(Show1 f, Show a) => Show (Lift f a) | |
type C Lift Source # | |
Defined in Data.HFunctor.Interpret |
An f a
, along with a Natural
index.
Step
f a ~ (Natural
, f a) Step f ~ ((,) Natural):.:
f -- functor composition
It is the fixed point of infinite applications of :+:
(functor sums).
Intuitively, in an infinite f :+: f :+: f :+: f ...
, you have
exactly one f
somewhere. A
has that Step
f af
, with
a Natural
giving you "where" the f
is in the long chain.
Can be useful for using with the Monoidal
instance of :+:
.
interpret
ing it requires no constraint on the
target context.
Note that this type and its instances equivalent to
.EnvT
(Sum
Natural
)
Instances
HFunctor (Step :: (k -> Type) -> k -> Type) Source # | |
HBind (Step :: (k -> Type) -> k -> Type) Source # | |
Inject (Step :: (k -> Type) -> k -> Type) Source # | Injects with 0. |
Interpret (Step :: (Type -> Type) -> Type -> Type) Source # | |
Functor f => Functor (Step f) Source # | |
Applicative f => Applicative (Step f) Source # | |
Foldable f => Foldable (Step f) Source # | |
Defined in Control.Applicative.Step fold :: Monoid m => Step f m -> m # foldMap :: Monoid m => (a -> m) -> Step f a -> m # foldr :: (a -> b -> b) -> b -> Step f a -> b # foldr' :: (a -> b -> b) -> b -> Step f a -> b # foldl :: (b -> a -> b) -> b -> Step f a -> b # foldl' :: (b -> a -> b) -> b -> Step f a -> b # foldr1 :: (a -> a -> a) -> Step f a -> a # foldl1 :: (a -> a -> a) -> Step f a -> a # elem :: Eq a => a -> Step f a -> Bool # maximum :: Ord a => Step f a -> a # minimum :: Ord a => Step f a -> a # | |
Traversable f => Traversable (Step f) Source # | |
Eq1 f => Eq1 (Step f) Source # | |
Ord1 f => Ord1 (Step f) Source # | |
Defined in Control.Applicative.Step | |
Read1 f => Read1 (Step f) Source # | |
Defined in Control.Applicative.Step | |
Show1 f => Show1 (Step f) Source # | |
Foldable1 f => Foldable1 (Step f) Source # | |
Pointed f => Pointed (Step f) Source # | |
Defined in Control.Applicative.Step | |
Traversable1 f => Traversable1 (Step f) Source # | |
Eq (f a) => Eq (Step f a) Source # | |
(Typeable a, Typeable f, Typeable k, Data (f a)) => Data (Step f a) Source # | |
Defined in Control.Applicative.Step gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Step f a -> c (Step f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Step f a) # toConstr :: Step f a -> Constr # dataTypeOf :: Step f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Step f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Step f a)) # gmapT :: (forall b. Data b => b -> b) -> Step f a -> Step f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Step f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Step f a -> r # gmapQ :: (forall d. Data d => d -> u) -> Step f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Step f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Step f a -> m (Step f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Step f a -> m (Step f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Step f a -> m (Step f a) # | |
Ord (f a) => Ord (Step f a) Source # | |
Defined in Control.Applicative.Step | |
Read (f a) => Read (Step f a) Source # | |
Show (f a) => Show (Step f a) Source # | |
Generic (Step f a) Source # | |
type C (Step :: (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (Step f a) Source # | |
Defined in Control.Applicative.Step type Rep (Step f a) = D1 (MetaData "Step" "Control.Applicative.Step" "functor-combinators-0.1.1.1-B2oyFu2GVTM8ySAuzVPoNk" False) (C1 (MetaCons "Step" PrefixI True) (S1 (MetaSel (Just "stepPos") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Natural) :*: S1 (MetaSel (Just "stepVal") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f a)))) |
A non-empty map of Natural
to f a
. Basically, contains multiple
f a
s, each at a given Natural
index.
Steps f a ~Map
Natural
(f a) Steps f ~Map
Natural
:.:
f -- functor composition
It is the fixed point of applications of TheseT
.
You can think of this as an infinite sparse array of f a
s.
Intuitively, in an infinite f `TheseT` f `TheseT` f `TheseT` f ...
,
each of those infinite positions may have an f
in them. However,
because of the at-least-one nature of TheseT
, we know we have at least
one f at one position somewhere.
A
has potentially many Steps
f af
s, each stored at a different
Natural
position, with the guaruntee that at least one f
exists.
Can be useful for using with the Monoidal
instance
of TheseT
.
interpret
ing it requires at least an Alt
instance in the target context, since we have to handle potentially more
than one f
.
This type is essentailly the same as
(except with a different NEMapF
(Sum
Natural
)Semigroup
instance).
Instances
HFunctor (Steps :: (k -> Type) -> k -> Type) Source # | |
Inject (Steps :: (k -> Type) -> k -> Type) Source # | Injects into a singleton map at 0; same behavior as |
Interpret (Steps :: (Type -> Type) -> Type -> Type) Source # | |
Functor f => Functor (Steps f) Source # | |
Foldable f => Foldable (Steps f) Source # | |
Defined in Control.Applicative.Step fold :: Monoid m => Steps f m -> m # foldMap :: Monoid m => (a -> m) -> Steps f a -> m # foldr :: (a -> b -> b) -> b -> Steps f a -> b # foldr' :: (a -> b -> b) -> b -> Steps f a -> b # foldl :: (b -> a -> b) -> b -> Steps f a -> b # foldl' :: (b -> a -> b) -> b -> Steps f a -> b # foldr1 :: (a -> a -> a) -> Steps f a -> a # foldl1 :: (a -> a -> a) -> Steps f a -> a # elem :: Eq a => a -> Steps f a -> Bool # maximum :: Ord a => Steps f a -> a # minimum :: Ord a => Steps f a -> a # | |
Traversable f => Traversable (Steps f) Source # | |
Eq1 f => Eq1 (Steps f) Source # | |
Ord1 f => Ord1 (Steps f) Source # | |
Defined in Control.Applicative.Step | |
Read1 f => Read1 (Steps f) Source # | |
Defined in Control.Applicative.Step | |
Show1 f => Show1 (Steps f) Source # | |
Foldable1 f => Foldable1 (Steps f) Source # | |
Pointed f => Pointed (Steps f) Source # | |
Defined in Control.Applicative.Step | |
Traversable1 f => Traversable1 (Steps f) Source # | |
Functor f => Alt (Steps f) Source # | Left-biased untion |
Eq (f a) => Eq (Steps f a) Source # | |
(Typeable a, Typeable f, Typeable k, Data (f a)) => Data (Steps f a) Source # | |
Defined in Control.Applicative.Step gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Steps f a -> c (Steps f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Steps f a) # toConstr :: Steps f a -> Constr # dataTypeOf :: Steps f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Steps f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Steps f a)) # gmapT :: (forall b. Data b => b -> b) -> Steps f a -> Steps f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Steps f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Steps f a -> r # gmapQ :: (forall d. Data d => d -> u) -> Steps f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Steps f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Steps f a -> m (Steps f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Steps f a -> m (Steps f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Steps f a -> m (Steps f a) # | |
Ord (f a) => Ord (Steps f a) Source # | |
Defined in Control.Applicative.Step | |
Read (f a) => Read (Steps f a) Source # | |
Show (f a) => Show (Steps f a) Source # | |
Generic (Steps f a) Source # | |
Semigroup (Steps f a) Source # | Appends the items back-to-back, shifting all of the items in the
second map. Matches the behavior as the fixed-point of |
type C (Steps :: (Type -> Type) -> Type -> Type) Source # | |
type Rep (Steps f a) Source # | |
Defined in Control.Applicative.Step |
The functor combinator that forgets all structure in the input. Ignores the input structure and stores no information.
Acts like the "zero" with respect to functor combinator composition.
ComposeT
ProxyF f ~ ProxyFComposeT
f ProxyF ~ ProxyF
It can be inject
ed into (losing all information), but it is impossible
to ever retract
or
interpret
it.
This is essentially
.ConstF
()
Instances
HFunctor (ProxyF :: (k1 -> Type) -> k2 -> Type) Source # | |
HBind (ProxyF :: (k -> Type) -> k -> Type) Source # | |
Inject (ProxyF :: (k -> Type) -> k -> Type) Source # | |
Interpret (ProxyF :: (Type -> Type) -> Type -> Type) Source # | The only way for this to obey |
Functor (ProxyF f :: Type -> Type) Source # | |
Foldable (ProxyF f :: Type -> Type) Source # | |
Defined in Data.HFunctor fold :: Monoid m => ProxyF f m -> m # foldMap :: Monoid m => (a -> m) -> ProxyF f a -> m # foldr :: (a -> b -> b) -> b -> ProxyF f a -> b # foldr' :: (a -> b -> b) -> b -> ProxyF f a -> b # foldl :: (b -> a -> b) -> b -> ProxyF f a -> b # foldl' :: (b -> a -> b) -> b -> ProxyF f a -> b # foldr1 :: (a -> a -> a) -> ProxyF f a -> a # foldl1 :: (a -> a -> a) -> ProxyF f a -> a # elem :: Eq a => a -> ProxyF f a -> Bool # maximum :: Ord a => ProxyF f a -> a # minimum :: Ord a => ProxyF f a -> a # | |
Traversable (ProxyF f :: Type -> Type) Source # | |
Eq1 (ProxyF f :: Type -> Type) Source # | |
Ord1 (ProxyF f :: Type -> Type) Source # | |
Defined in Data.HFunctor | |
Read1 (ProxyF f :: Type -> Type) Source # | |
Defined in Data.HFunctor | |
Show1 (ProxyF f :: Type -> Type) Source # | |
Eq (ProxyF f a) Source # | |
(Typeable f, Typeable a, Typeable k1, Typeable k2) => Data (ProxyF f a) Source # | |
Defined in Data.HFunctor gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ProxyF f a -> c (ProxyF f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (ProxyF f a) # toConstr :: ProxyF f a -> Constr # dataTypeOf :: ProxyF f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (ProxyF f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (ProxyF f a)) # gmapT :: (forall b. Data b => b -> b) -> ProxyF f a -> ProxyF f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ProxyF f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ProxyF f a -> r # gmapQ :: (forall d. Data d => d -> u) -> ProxyF f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> ProxyF f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> ProxyF f a -> m (ProxyF f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ProxyF f a -> m (ProxyF f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ProxyF f a -> m (ProxyF f a) # | |
Ord (ProxyF f a) Source # | |
Read (ProxyF f a) Source # | |
Show (ProxyF f a) Source # | |
Generic (ProxyF f a) Source # | |
type C (ProxyF :: (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (ProxyF f a) Source # | |
Functor combinator that forgets all structure on the input, and
instead stores a value of type e
.
Like ProxyF
, acts like a "zero" with functor combinator composition.
It can be inject
ed into (losing all information), but it is impossible
to ever retract
or
interpret
it.
Instances
HFunctor (ConstF e :: (k1 -> Type) -> k2 -> Type) Source # | |
Monoid e => Inject (ConstF e :: (k -> Type) -> k -> Type) Source # | |
Monoid e => Interpret (ConstF e :: (Type -> Type) -> Type -> Type) Source # | The only way for this to obey |
Functor (ConstF e f :: Type -> Type) Source # | |
Foldable (ConstF e f :: Type -> Type) Source # | |
Defined in Data.HFunctor fold :: Monoid m => ConstF e f m -> m # foldMap :: Monoid m => (a -> m) -> ConstF e f a -> m # foldr :: (a -> b -> b) -> b -> ConstF e f a -> b # foldr' :: (a -> b -> b) -> b -> ConstF e f a -> b # foldl :: (b -> a -> b) -> b -> ConstF e f a -> b # foldl' :: (b -> a -> b) -> b -> ConstF e f a -> b # foldr1 :: (a -> a -> a) -> ConstF e f a -> a # foldl1 :: (a -> a -> a) -> ConstF e f a -> a # toList :: ConstF e f a -> [a] # null :: ConstF e f a -> Bool # length :: ConstF e f a -> Int # elem :: Eq a => a -> ConstF e f a -> Bool # maximum :: Ord a => ConstF e f a -> a # minimum :: Ord a => ConstF e f a -> a # | |
Traversable (ConstF e f :: Type -> Type) Source # | |
Defined in Data.HFunctor | |
Eq e => Eq1 (ConstF e f :: Type -> Type) Source # | |
Ord e => Ord1 (ConstF e f :: Type -> Type) Source # | |
Defined in Data.HFunctor | |
Read e => Read1 (ConstF e f :: Type -> Type) Source # | |
Defined in Data.HFunctor | |
Show e => Show1 (ConstF e f :: Type -> Type) Source # | |
Eq e => Eq (ConstF e f a) Source # | |
(Typeable f, Typeable a, Typeable k1, Typeable k2, Data e) => Data (ConstF e f a) Source # | |
Defined in Data.HFunctor gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ConstF e f a -> c (ConstF e f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (ConstF e f a) # toConstr :: ConstF e f a -> Constr # dataTypeOf :: ConstF e f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (ConstF e f a)) # dataCast2 :: Typeable t => (forall d e0. (Data d, Data e0) => c (t d e0)) -> Maybe (c (ConstF e f a)) # gmapT :: (forall b. Data b => b -> b) -> ConstF e f a -> ConstF e f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ConstF e f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ConstF e f a -> r # gmapQ :: (forall d. Data d => d -> u) -> ConstF e f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> ConstF e f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> ConstF e f a -> m (ConstF e f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ConstF e f a -> m (ConstF e f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ConstF e f a -> m (ConstF e f a) # | |
Ord e => Ord (ConstF e f a) Source # | |
Defined in Data.HFunctor | |
Read e => Read (ConstF e f a) Source # | |
Show e => Show (ConstF e f a) Source # | |
Generic (ConstF e f a) Source # | |
type C (ConstF e :: (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (ConstF e f a) Source # | |
Defined in Data.HFunctor |
data EnvT e (w :: Type -> Type) a #
EnvT e (w a) |
Instances
ComonadTrans (EnvT e) | |
Defined in Control.Comonad.Trans.Env | |
ComonadHoist (EnvT e) | |
Monoid e => Interpret (EnvT e) Source # | |
Monoid e => HBind (EnvT e :: (Type -> Type) -> Type -> Type) Source # | Combines the accumulators, Writer-style |
Monoid e => Inject (EnvT e :: (Type -> Type) -> Type -> Type) Source # | |
HFunctor (EnvT e :: (Type -> Type) -> Type -> Type) Source # | |
Functor w => Functor (EnvT e w) | |
(Monoid e, Applicative m) => Applicative (EnvT e m) | |
Foldable w => Foldable (EnvT e w) | |
Defined in Control.Comonad.Trans.Env fold :: Monoid m => EnvT e w m -> m # foldMap :: Monoid m => (a -> m) -> EnvT e w a -> m # foldr :: (a -> b -> b) -> b -> EnvT e w a -> b # foldr' :: (a -> b -> b) -> b -> EnvT e w a -> b # foldl :: (b -> a -> b) -> b -> EnvT e w a -> b # foldl' :: (b -> a -> b) -> b -> EnvT e w a -> b # foldr1 :: (a -> a -> a) -> EnvT e w a -> a # foldl1 :: (a -> a -> a) -> EnvT e w a -> a # elem :: Eq a => a -> EnvT e w a -> Bool # maximum :: Ord a => EnvT e w a -> a # minimum :: Ord a => EnvT e w a -> a # | |
Traversable w => Traversable (EnvT e w) | |
Comonad w => Comonad (EnvT e w) | |
(Semigroup e, ComonadApply w) => ComonadApply (EnvT e w) | |
(Semigroup e, Apply w) => Apply (EnvT e w) | |
(Data e, Typeable w, Data (w a), Data a) => Data (EnvT e w a) | |
Defined in Control.Comonad.Trans.Env gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> EnvT e w a -> c (EnvT e w a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (EnvT e w a) # toConstr :: EnvT e w a -> Constr # dataTypeOf :: EnvT e w a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (EnvT e w a)) # dataCast2 :: Typeable t => (forall d e0. (Data d, Data e0) => c (t d e0)) -> Maybe (c (EnvT e w a)) # gmapT :: (forall b. Data b => b -> b) -> EnvT e w a -> EnvT e w a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> EnvT e w a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> EnvT e w a -> r # gmapQ :: (forall d. Data d => d -> u) -> EnvT e w a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> EnvT e w a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> EnvT e w a -> m (EnvT e w a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> EnvT e w a -> m (EnvT e w a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> EnvT e w a -> m (EnvT e w a) # | |
type C (EnvT e) Source # | |
Defined in Data.HFunctor.Interpret |
newtype ReaderT r (m :: k -> Type) (a :: k) :: forall k. Type -> (k -> Type) -> k -> Type #
The reader monad transformer, which adds a read-only environment to the given monad.
The return
function ignores the environment, while >>=
passes
the inherited environment to both subcomputations.
ReaderT | |
|
Instances
An f a
, along with a Bool
flag
Flagged
f a ~ (Bool
, f a) Flagged f ~ ((,) Bool):.:
f -- functor composition
Creation with inject
or pure
uses False
as the
boolean.
You can think of it as an f a
that is "flagged" with a boolean value,
and that value can indicuate whether or not it is "pure" (made with
inject
or pure
) as False
, or "impure"
(made from some other source) as True
. However, False
may be always
created directly, of course, using the constructor.
You can think of it like a Step
that is either 0 or 1, as well.
interpret
ing it requires no constraint on the
target context.
This type is equivalent (along with its instances) to:
Flagged | |
|
Instances
HFunctor (Flagged :: (k -> Type) -> k -> Type) Source # | |
HBind (Flagged :: (k -> Type) -> k -> Type) Source # | |
Inject (Flagged :: (k -> Type) -> k -> Type) Source # | Injects with |
Interpret (Flagged :: (Type -> Type) -> Type -> Type) Source # | |
Functor f => Functor (Flagged f) Source # | |
Applicative f => Applicative (Flagged f) Source # | |
Foldable f => Foldable (Flagged f) Source # | |
Defined in Control.Applicative.Step fold :: Monoid m => Flagged f m -> m # foldMap :: Monoid m => (a -> m) -> Flagged f a -> m # foldr :: (a -> b -> b) -> b -> Flagged f a -> b # foldr' :: (a -> b -> b) -> b -> Flagged f a -> b # foldl :: (b -> a -> b) -> b -> Flagged f a -> b # foldl' :: (b -> a -> b) -> b -> Flagged f a -> b # foldr1 :: (a -> a -> a) -> Flagged f a -> a # foldl1 :: (a -> a -> a) -> Flagged f a -> a # toList :: Flagged f a -> [a] # length :: Flagged f a -> Int # elem :: Eq a => a -> Flagged f a -> Bool # maximum :: Ord a => Flagged f a -> a # minimum :: Ord a => Flagged f a -> a # | |
Traversable f => Traversable (Flagged f) Source # | |
Defined in Control.Applicative.Step | |
Eq1 f => Eq1 (Flagged f) Source # | |
Ord1 f => Ord1 (Flagged f) Source # | |
Defined in Control.Applicative.Step | |
Read1 f => Read1 (Flagged f) Source # | |
Defined in Control.Applicative.Step | |
Show1 f => Show1 (Flagged f) Source # | |
Foldable1 f => Foldable1 (Flagged f) Source # | |
Pointed f => Pointed (Flagged f) Source # | |
Defined in Control.Applicative.Step | |
Traversable1 f => Traversable1 (Flagged f) Source # | |
Eq (f a) => Eq (Flagged f a) Source # | |
(Typeable a, Typeable f, Typeable k, Data (f a)) => Data (Flagged f a) Source # | |
Defined in Control.Applicative.Step gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Flagged f a -> c (Flagged f a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Flagged f a) # toConstr :: Flagged f a -> Constr # dataTypeOf :: Flagged f a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Flagged f a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Flagged f a)) # gmapT :: (forall b. Data b => b -> b) -> Flagged f a -> Flagged f a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Flagged f a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Flagged f a -> r # gmapQ :: (forall d. Data d => d -> u) -> Flagged f a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Flagged f a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Flagged f a -> m (Flagged f a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Flagged f a -> m (Flagged f a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Flagged f a -> m (Flagged f a) # | |
Ord (f a) => Ord (Flagged f a) Source # | |
Defined in Control.Applicative.Step | |
Read (f a) => Read (Flagged f a) Source # | |
Show (f a) => Show (Flagged f a) Source # | |
Generic (Flagged f a) Source # | |
type C (Flagged :: (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HFunctor.Interpret type C (Flagged :: (Type -> Type) -> Type -> Type) = (Unconstrained :: (Type -> Type) -> Constraint) | |
type Rep (Flagged f a) Source # | |
Defined in Control.Applicative.Step type Rep (Flagged f a) = D1 (MetaData "Flagged" "Control.Applicative.Step" "functor-combinators-0.1.1.1-B2oyFu2GVTM8ySAuzVPoNk" False) (C1 (MetaCons "Flagged" PrefixI True) (S1 (MetaSel (Just "flaggedFlag") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Bool) :*: S1 (MetaSel (Just "flaggedVal") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f a)))) |
newtype IdentityT (f :: k -> Type) (a :: k) :: forall k. (k -> Type) -> k -> Type #
The trivial monad transformer, which maps a monad to an equivalent monad.
IdentityT | |
|
Instances
is uninhabited for all Void2
a ba
and b
.
Instances
HFunctor (Void2 :: (k1 -> Type) -> k2 -> Type) Source # | |
Functor (Void2 a :: Type -> Type) Source # | |
Foldable (Void2 a :: Type -> Type) Source # | |
Defined in Control.Applicative.Step fold :: Monoid m => Void2 a m -> m # foldMap :: Monoid m => (a0 -> m) -> Void2 a a0 -> m # foldr :: (a0 -> b -> b) -> b -> Void2 a a0 -> b # foldr' :: (a0 -> b -> b) -> b -> Void2 a a0 -> b # foldl :: (b -> a0 -> b) -> b -> Void2 a a0 -> b # foldl' :: (b -> a0 -> b) -> b -> Void2 a a0 -> b # foldr1 :: (a0 -> a0 -> a0) -> Void2 a a0 -> a0 # foldl1 :: (a0 -> a0 -> a0) -> Void2 a a0 -> a0 # toList :: Void2 a a0 -> [a0] # elem :: Eq a0 => a0 -> Void2 a a0 -> Bool # maximum :: Ord a0 => Void2 a a0 -> a0 # minimum :: Ord a0 => Void2 a a0 -> a0 # | |
Traversable (Void2 a :: Type -> Type) Source # | |
Eq1 (Void2 a :: Type -> Type) Source # | |
Ord1 (Void2 a :: Type -> Type) Source # | |
Defined in Control.Applicative.Step | |
Read1 (Void2 a :: Type -> Type) Source # | |
Defined in Control.Applicative.Step | |
Show1 (Void2 a :: Type -> Type) Source # | |
Apply (Void2 a :: Type -> Type) Source # | |
Alt (Void2 a :: Type -> Type) Source # | |
Bind (Void2 a :: Type -> Type) Source # | |
Eq (Void2 a b) Source # | |
(Typeable a, Typeable b, Typeable k1, Typeable k2) => Data (Void2 a b) Source # | |
Defined in Control.Applicative.Step gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Void2 a b -> c (Void2 a b) # gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Void2 a b) # toConstr :: Void2 a b -> Constr # dataTypeOf :: Void2 a b -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Void2 a b)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Void2 a b)) # gmapT :: (forall b0. Data b0 => b0 -> b0) -> Void2 a b -> Void2 a b # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Void2 a b -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Void2 a b -> r # gmapQ :: (forall d. Data d => d -> u) -> Void2 a b -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Void2 a b -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Void2 a b -> m (Void2 a b) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Void2 a b -> m (Void2 a b) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Void2 a b -> m (Void2 a b) # | |
Ord (Void2 a b) Source # | |
Defined in Control.Applicative.Step | |
Read (Void2 a b) Source # | |
Show (Void2 a b) Source # | |
Generic (Void2 a b) Source # | |
Semigroup (Void2 a b) Source # | |
type Rep (Void2 a b) Source # | |
A simple way to inject/reject into any eventual typeclass.
In a way, this is the "ultimate" multi-purpose Interpret
instance.
You can use this to inject an f
into a free structure of any
typeclass. If you want f
to have a Monad
instance, for example,
just use
inject
:: f a ->Final
Monad
f a
When you want to eventually interpret out the data, use:
interpret
:: (f~>
g) ->Final
c f a -> g a
Essentially,
is the "free c". Final
c
is the free
Final
Monad
Monad
, etc.
Final
can theoretically replace Ap
, Ap1
, ListF
, NonEmptyF
,
MaybeF
, Free
, Identity
, Coyoneda
, and
other instances of FreeOf
, if you don't care about being able to
pattern match on explicit structure.
However, it cannot replace Interpret
instances that are not free
structures, like Step
,
Steps
,
Backwards
, etc.
Note that this doesn't have instances for all the typeclasses you
could lift things into; you probably have to define your own if you want
to use
as an instance of Final
cc
(using liftFinal0
,
liftFinal1
, liftFinal2
for help).
Instances
class Interpret t => FreeOf c t | t -> c where Source #
A typeclass associating a free structure with the typeclass it is free on.
This essentially lists instances of Interpret
where a "trip" through
Final
will leave it unchanged.
fromFree
.toFree
== idtoFree
.fromFree
== id
This can be useful because Final
doesn't have a concrete structure
that you can pattern match on and inspect, but t
might. This lets you
work on a concrete structure if you desire.
Nothing
fromFree :: t f ~> Final c f Source #
toFree :: Functor f => Final c f ~> t f Source #
Instances
FreeOf Monad Free Source # | |
FreeOf Functor Coyoneda Source # | |
FreeOf Applicative Ap Source # | |
FreeOf Applicative Ap Source # | |
FreeOf Alternative Alt Source # | |
FreeOf Apply Ap1 Source # | |
FreeOf Pointed MaybeApply Source # | |
FreeOf Pointed Lift Source # | |
FreeOf Plus ListF Source # | |
FreeOf Alt NonEmptyF Source # | |
FreeOf Bind Free1 Source # | |
FreeOf (Unconstrained :: (Type -> Type) -> Constraint) (IdentityT :: (Type -> Type) -> Type -> Type) Source # | |
newtype ComposeT (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a infixr 9 #
Composition of monad transformers.
ComposeT infixr 9 | |
|
Instances
MonadRWS r w s (f (g m)) => MonadRWS r w s (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose | |
MonadReader r (f (g m)) => MonadReader r (ComposeT f g m) | |
MonadState s (f (g m)) => MonadState s (ComposeT f g m) | |
MonadWriter w (f (g m)) => MonadWriter w (ComposeT f g m) | |
MonadError e (f (g m)) => MonadError e (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose throwError :: e -> ComposeT f g m a # catchError :: ComposeT f g m a -> (e -> ComposeT f g m a) -> ComposeT f g m a # | |
(HFunctor s, HFunctor t) => HFunctor (ComposeT s t :: (Type -> Type) -> Type -> Type) Source # | |
(MFunctor f, MFunctor g, forall (m :: Type -> Type). Monad m => Monad (g m)) => MFunctor (ComposeT f g :: (Type -> Type) -> Type -> Type) | |
(Inject s, Inject t) => Inject (ComposeT s t :: (Type -> Type) -> Type -> Type) Source # | |
(MFunctor f, MonadTrans f, MonadTrans g) => MonadTrans (ComposeT f g) | |
Defined in Control.Monad.Trans.Compose | |
(Interpret s, Interpret t) => Interpret (ComposeT s t) Source # | |
Monad (f (g m)) => Monad (ComposeT f g m) | |
Functor (f (g m)) => Functor (ComposeT f g m) | |
MonadFail (f (g m)) => MonadFail (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose | |
Applicative (f (g m)) => Applicative (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose pure :: a -> ComposeT f g m a # (<*>) :: ComposeT f g m (a -> b) -> ComposeT f g m a -> ComposeT f g m b # liftA2 :: (a -> b -> c) -> ComposeT f g m a -> ComposeT f g m b -> ComposeT f g m c # (*>) :: ComposeT f g m a -> ComposeT f g m b -> ComposeT f g m b # (<*) :: ComposeT f g m a -> ComposeT f g m b -> ComposeT f g m a # | |
Foldable (f (g m)) => Foldable (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose fold :: Monoid m0 => ComposeT f g m m0 -> m0 # foldMap :: Monoid m0 => (a -> m0) -> ComposeT f g m a -> m0 # foldr :: (a -> b -> b) -> b -> ComposeT f g m a -> b # foldr' :: (a -> b -> b) -> b -> ComposeT f g m a -> b # foldl :: (b -> a -> b) -> b -> ComposeT f g m a -> b # foldl' :: (b -> a -> b) -> b -> ComposeT f g m a -> b # foldr1 :: (a -> a -> a) -> ComposeT f g m a -> a # foldl1 :: (a -> a -> a) -> ComposeT f g m a -> a # toList :: ComposeT f g m a -> [a] # null :: ComposeT f g m a -> Bool # length :: ComposeT f g m a -> Int # elem :: Eq a => a -> ComposeT f g m a -> Bool # maximum :: Ord a => ComposeT f g m a -> a # minimum :: Ord a => ComposeT f g m a -> a # | |
Traversable (f (g m)) => Traversable (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose traverse :: Applicative f0 => (a -> f0 b) -> ComposeT f g m a -> f0 (ComposeT f g m b) # sequenceA :: Applicative f0 => ComposeT f g m (f0 a) -> f0 (ComposeT f g m a) # mapM :: Monad m0 => (a -> m0 b) -> ComposeT f g m a -> m0 (ComposeT f g m b) # sequence :: Monad m0 => ComposeT f g m (m0 a) -> m0 (ComposeT f g m a) # | |
Alternative (f (g m)) => Alternative (ComposeT f g m) | |
MonadPlus (f (g m)) => MonadPlus (ComposeT f g m) | |
MonadIO (f (g m)) => MonadIO (ComposeT f g m) | |
Defined in Control.Monad.Trans.Compose | |
MonadCont (f (g m)) => MonadCont (ComposeT f g m) | |
Eq (f (g m) a) => Eq (ComposeT f g m a) | |
Ord (f (g m) a) => Ord (ComposeT f g m a) | |
Defined in Control.Monad.Trans.Compose compare :: ComposeT f g m a -> ComposeT f g m a -> Ordering # (<) :: ComposeT f g m a -> ComposeT f g m a -> Bool # (<=) :: ComposeT f g m a -> ComposeT f g m a -> Bool # (>) :: ComposeT f g m a -> ComposeT f g m a -> Bool # (>=) :: ComposeT f g m a -> ComposeT f g m a -> Bool # max :: ComposeT f g m a -> ComposeT f g m a -> ComposeT f g m a # min :: ComposeT f g m a -> ComposeT f g m a -> ComposeT f g m a # | |
Read (f (g m) a) => Read (ComposeT f g m a) | |
Show (f (g m) a) => Show (ComposeT f g m a) | |
type C (ComposeT s t) Source # | |
Multi
data Day (f :: Type -> Type) (g :: Type -> Type) a where #
The Day convolution of two covariant functors.
Day :: forall (f :: Type -> Type) (g :: Type -> Type) a b c. f b -> g c -> (b -> c -> a) -> Day f g a |
Instances
data ((f :: k -> Type) :*: (g :: k -> Type)) (p :: k) :: forall k. (k -> Type) -> (k -> Type) -> k -> Type infixr 6 #
Products: encode multiple arguments to constructors
(f p) :*: (g p) infixr 6 |
Instances
HBifunctor ((:*:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HFunctor ((:*:) f :: (k -> Type) -> k -> Type) Source # | |
Generic1 (f :*: g :: k -> Type) | |
Semigroupoidal ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Associative appendSF :: (SF (:*:) f :*: SF (:*:) f) ~> SF (:*:) f Source # matchSF :: Functor f => SF (:*:) f ~> (f :+: (f :*: SF (:*:) f)) Source # consSF :: (f :*: SF (:*:) f) ~> SF (:*:) f Source # toSF :: (f :*: f) ~> SF (:*:) f Source # biretract :: CS (:*:) f => (f :*: f) ~> f Source # binterpret :: CS (:*:) h => (f ~> h) -> (g ~> h) -> (f :*: g) ~> h Source # | |
Associative ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Matchable ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Monoidal ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Tensor appendMF :: (MF (:*:) f :*: MF (:*:) f) ~> MF (:*:) f Source # splitSF :: SF (:*:) f ~> (f :*: MF (:*:) f) Source # splittingMF :: MF (:*:) f <~> (I (:*:) :+: (f :*: MF (:*:) f)) Source # toMF :: (f :*: f) ~> MF (:*:) f Source # fromSF :: SF (:*:) f ~> MF (:*:) f Source # pureT :: CM (:*:) f => I (:*:) ~> f Source # upgradeC :: CM (:*:) f => proxy f -> (CS (:*:) f -> r) -> r Source # | |
Tensor ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Plus f => HBind ((:*:) f :: (Type -> Type) -> Type -> Type) Source # | |
Plus f => Inject ((:*:) f :: (Type -> Type) -> Type -> Type) Source # | Only uses |
Plus f => Interpret ((:*:) f) Source # | |
(Monad f, Monad g) => Monad (f :*: g) | Since: base-4.9.0.0 |
(Functor f, Functor g) => Functor (f :*: g) | Since: base-4.9.0.0 |
(MonadFix f, MonadFix g) => MonadFix (f :*: g) | Since: base-4.9.0.0 |
Defined in Control.Monad.Fix | |
(Applicative f, Applicative g) => Applicative (f :*: g) | Since: base-4.9.0.0 |
(Foldable f, Foldable g) => Foldable (f :*: g) | Since: base-4.9.0.0 |
Defined in Data.Foldable fold :: Monoid m => (f :*: g) m -> m # foldMap :: Monoid m => (a -> m) -> (f :*: g) a -> m # foldr :: (a -> b -> b) -> b -> (f :*: g) a -> b # foldr' :: (a -> b -> b) -> b -> (f :*: g) a -> b # foldl :: (b -> a -> b) -> b -> (f :*: g) a -> b # foldl' :: (b -> a -> b) -> b -> (f :*: g) a -> b # foldr1 :: (a -> a -> a) -> (f :*: g) a -> a # foldl1 :: (a -> a -> a) -> (f :*: g) a -> a # toList :: (f :*: g) a -> [a] # length :: (f :*: g) a -> Int # elem :: Eq a => a -> (f :*: g) a -> Bool # maximum :: Ord a => (f :*: g) a -> a # minimum :: Ord a => (f :*: g) a -> a # | |
(Traversable f, Traversable g) => Traversable (f :*: g) | Since: base-4.9.0.0 |
(Contravariant f, Contravariant g) => Contravariant (f :*: g) | |
(Representable f, Representable g) => Representable (f :*: g) | |
(Alternative f, Alternative g) => Alternative (f :*: g) | Since: base-4.9.0.0 |
(MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) | Since: base-4.9.0.0 |
(Foldable1 f, Foldable1 g) => Foldable1 (f :*: g) | |
(Apply f, Apply g) => Apply (f :*: g) | |
(Pointed f, Pointed g) => Pointed (f :*: g) | |
Defined in Data.Pointed | |
(Traversable1 f, Traversable1 g) => Traversable1 (f :*: g) | |
(Plus f, Plus g) => Plus (f :*: g) | |
Defined in Data.Functor.Plus | |
(Alt f, Alt g) => Alt (f :*: g) | |
(GIndex f, GIndex g) => GIndex (f :*: g) | |
Defined in Data.Functor.Rep | |
(GTabulate f, GTabulate g) => GTabulate (f :*: g) | |
Defined in Data.Functor.Rep gtabulate' :: (GRep' (f :*: g) -> a) -> (f :*: g) a | |
(GDefault a, GDefault b) => GDefault (a :*: b) | |
Defined in Data.Default.Class | |
(Eq (f p), Eq (g p)) => Eq ((f :*: g) p) | Since: base-4.7.0.0 |
(Typeable f, Typeable g, Data p, Data (f p), Data (g p)) => Data ((f :*: g) p) | Since: base-4.9.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> (f :*: g) p -> c ((f :*: g) p) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ((f :*: g) p) # toConstr :: (f :*: g) p -> Constr # dataTypeOf :: (f :*: g) p -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ((f :*: g) p)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ((f :*: g) p)) # gmapT :: (forall b. Data b => b -> b) -> (f :*: g) p -> (f :*: g) p # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> (f :*: g) p -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> (f :*: g) p -> r # gmapQ :: (forall d. Data d => d -> u) -> (f :*: g) p -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> (f :*: g) p -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) # | |
(Ord (f p), Ord (g p)) => Ord ((f :*: g) p) | Since: base-4.7.0.0 |
(Read (f p), Read (g p)) => Read ((f :*: g) p) | Since: base-4.7.0.0 |
(Show (f p), Show (g p)) => Show ((f :*: g) p) | Since: base-4.7.0.0 |
Generic ((f :*: g) p) | |
(Semigroup (f p), Semigroup (g p)) => Semigroup ((f :*: g) p) | Since: base-4.12.0.0 |
(Monoid (f p), Monoid (g p)) => Monoid ((f :*: g) p) | Since: base-4.12.0.0 |
type Rep1 (f :*: g :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics type Rep1 (f :*: g :: k -> Type) = D1 (MetaData ":*:" "GHC.Generics" "base" False) (C1 (MetaCons ":*:" (InfixI RightAssociative 6) False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g))) | |
type SF ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type MF ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type I ((:*:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type C ((:*:) f) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep (f :*: g) | |
type GRep' (f :*: g) | |
Defined in Data.Functor.Rep | |
type Rep ((f :*: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics type Rep ((f :*: g) p) = D1 (MetaData ":*:" "GHC.Generics" "base" False) (C1 (MetaCons ":*:" (InfixI RightAssociative 6) False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f p)) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g p)))) |
data ((f :: k -> Type) :+: (g :: k -> Type)) (p :: k) :: forall k. (k -> Type) -> (k -> Type) -> k -> Type infixr 5 #
Sums: encode choice between constructors
Instances
HBifunctor ((:+:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # | |
HFunctor ((:+:) f :: (k -> Type) -> k -> Type) Source # | |
HBind ((:+:) f :: (k -> Type) -> k -> Type) Source # | |
Inject ((:+:) f :: (k -> Type) -> k -> Type) Source # | |
Generic1 (f :+: g :: k -> Type) | |
(GSum arity a, GSum arity b) => GSum arity (a :+: b) | |
Semigroupoidal ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Associative appendSF :: (SF (:+:) f :+: SF (:+:) f) ~> SF (:+:) f Source # matchSF :: Functor f => SF (:+:) f ~> (f :+: (f :+: SF (:+:) f)) Source # consSF :: (f :+: SF (:+:) f) ~> SF (:+:) f Source # toSF :: (f :+: f) ~> SF (:+:) f Source # biretract :: CS (:+:) f => (f :+: f) ~> f Source # binterpret :: CS (:+:) h => (f ~> h) -> (g ~> h) -> (f :+: g) ~> h Source # | |
Associative ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Matchable ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Monoidal ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Tensor appendMF :: (MF (:+:) f :+: MF (:+:) f) ~> MF (:+:) f Source # splitSF :: SF (:+:) f ~> (f :+: MF (:+:) f) Source # splittingMF :: MF (:+:) f <~> (I (:+:) :+: (f :+: MF (:+:) f)) Source # toMF :: (f :+: f) ~> MF (:+:) f Source # fromSF :: SF (:+:) f ~> MF (:+:) f Source # pureT :: CM (:+:) f => I (:+:) ~> f Source # upgradeC :: CM (:+:) f => proxy f -> (CS (:+:) f -> r) -> r Source # | |
Tensor ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Interpret ((:+:) f) Source # | Technically, |
(Functor f, Functor g) => Functor (f :+: g) | Since: base-4.9.0.0 |
(Foldable f, Foldable g) => Foldable (f :+: g) | Since: base-4.9.0.0 |
Defined in Data.Foldable fold :: Monoid m => (f :+: g) m -> m # foldMap :: Monoid m => (a -> m) -> (f :+: g) a -> m # foldr :: (a -> b -> b) -> b -> (f :+: g) a -> b # foldr' :: (a -> b -> b) -> b -> (f :+: g) a -> b # foldl :: (b -> a -> b) -> b -> (f :+: g) a -> b # foldl' :: (b -> a -> b) -> b -> (f :+: g) a -> b # foldr1 :: (a -> a -> a) -> (f :+: g) a -> a # foldl1 :: (a -> a -> a) -> (f :+: g) a -> a # toList :: (f :+: g) a -> [a] # length :: (f :+: g) a -> Int # elem :: Eq a => a -> (f :+: g) a -> Bool # maximum :: Ord a => (f :+: g) a -> a # minimum :: Ord a => (f :+: g) a -> a # | |
(Traversable f, Traversable g) => Traversable (f :+: g) | Since: base-4.9.0.0 |
(Contravariant f, Contravariant g) => Contravariant (f :+: g) | |
(Foldable1 f, Foldable1 g) => Foldable1 (f :+: g) | |
(Traversable1 f, Traversable1 g) => Traversable1 (f :+: g) | |
(SumSize a, SumSize b) => SumSize (a :+: b) | |
Defined in Data.Hashable.Generic.Instances | |
(GSumGet a, GSumGet b) => GSumGet (a :+: b) | |
(SumSize a, SumSize b) => SumSize (a :+: b) | |
Defined in Data.Binary.Generic | |
(GSumPut a, GSumPut b) => GSumPut (a :+: b) | |
(Eq (f p), Eq (g p)) => Eq ((f :+: g) p) | Since: base-4.7.0.0 |
(Typeable f, Typeable g, Data p, Data (f p), Data (g p)) => Data ((f :+: g) p) | Since: base-4.9.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> (f :+: g) p -> c ((f :+: g) p) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ((f :+: g) p) # toConstr :: (f :+: g) p -> Constr # dataTypeOf :: (f :+: g) p -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ((f :+: g) p)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ((f :+: g) p)) # gmapT :: (forall b. Data b => b -> b) -> (f :+: g) p -> (f :+: g) p # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> (f :+: g) p -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> (f :+: g) p -> r # gmapQ :: (forall d. Data d => d -> u) -> (f :+: g) p -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> (f :+: g) p -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) # | |
(Ord (f p), Ord (g p)) => Ord ((f :+: g) p) | Since: base-4.7.0.0 |
(Read (f p), Read (g p)) => Read ((f :+: g) p) | Since: base-4.7.0.0 |
(Show (f p), Show (g p)) => Show ((f :+: g) p) | Since: base-4.7.0.0 |
Generic ((f :+: g) p) | |
type Rep1 (f :+: g :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics type Rep1 (f :+: g :: k -> Type) = D1 (MetaData ":+:" "GHC.Generics" "base" False) (C1 (MetaCons "L1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f)) :+: C1 (MetaCons "R1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g))) | |
type SF ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type MF ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type I ((:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type C ((:+:) f) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep ((f :+: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics type Rep ((f :+: g) p) = D1 (MetaData ":+:" "GHC.Generics" "base" False) (C1 (MetaCons "L1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f p))) :+: C1 (MetaCons "R1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g p)))) |
data V1 (p :: k) :: forall k. k -> Type #
Void: used for datatypes without constructors
Instances
Generic1 (V1 :: k -> Type) | |
Functor (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Foldable (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable fold :: Monoid m => V1 m -> m # foldMap :: Monoid m => (a -> m) -> V1 a -> m # foldr :: (a -> b -> b) -> b -> V1 a -> b # foldr' :: (a -> b -> b) -> b -> V1 a -> b # foldl :: (b -> a -> b) -> b -> V1 a -> b # foldl' :: (b -> a -> b) -> b -> V1 a -> b # foldr1 :: (a -> a -> a) -> V1 a -> a # foldl1 :: (a -> a -> a) -> V1 a -> a # elem :: Eq a => a -> V1 a -> Bool # maximum :: Ord a => V1 a -> a # | |
Traversable (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Contravariant (V1 :: Type -> Type) | |
Foldable1 (V1 :: Type -> Type) | |
Apply (V1 :: Type -> Type) | |
Traversable1 (V1 :: Type -> Type) | |
Alt (V1 :: Type -> Type) | |
Bind (V1 :: Type -> Type) | |
Eq (V1 p) | Since: base-4.9.0.0 |
Data p => Data (V1 p) | Since: base-4.9.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> V1 p -> c (V1 p) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (V1 p) # dataTypeOf :: V1 p -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (V1 p)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (V1 p)) # gmapT :: (forall b. Data b => b -> b) -> V1 p -> V1 p # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> V1 p -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> V1 p -> r # gmapQ :: (forall d. Data d => d -> u) -> V1 p -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> V1 p -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) # | |
Ord (V1 p) | Since: base-4.9.0.0 |
Read (V1 p) | Since: base-4.9.0.0 |
Show (V1 p) | Since: base-4.9.0.0 |
Generic (V1 p) | |
Semigroup (V1 p) | Since: base-4.12.0.0 |
type Rep1 (V1 :: k -> Type) | Since: base-4.9.0.0 |
type Rep (V1 p) | Since: base-4.9.0.0 |
data These1 (f :: Type -> Type) (g :: Type -> Type) a #
Instances
Semigroupoidal These1 Source # | Ideally here |
Defined in Data.HBifunctor.Associative appendSF :: These1 (SF These1 f) (SF These1 f) ~> SF These1 f Source # matchSF :: Functor f => SF These1 f ~> (f :+: These1 f (SF These1 f)) Source # consSF :: These1 f (SF These1 f) ~> SF These1 f Source # toSF :: These1 f f ~> SF These1 f Source # biretract :: CS These1 f => These1 f f ~> f Source # binterpret :: CS These1 h => (f ~> h) -> (g ~> h) -> These1 f g ~> h Source # | |
Associative These1 Source # | |
Monoidal These1 Source # | |
Defined in Data.HBifunctor.Tensor appendMF :: These1 (MF These1 f) (MF These1 f) ~> MF These1 f Source # splitSF :: SF These1 f ~> These1 f (MF These1 f) Source # splittingMF :: MF These1 f <~> (I These1 :+: These1 f (MF These1 f)) Source # toMF :: These1 f f ~> MF These1 f Source # fromSF :: SF These1 f ~> MF These1 f Source # pureT :: CM These1 f => I These1 ~> f Source # upgradeC :: CM These1 f => proxy f -> (CS These1 f -> r) -> r Source # | |
Tensor These1 Source # | |
Interpret (These1 f) Source # | Technically, |
Alt f => HBind (These1 f :: (Type -> Type) -> Type -> Type) Source # | |
Inject (These1 f :: (Type -> Type) -> Type -> Type) Source # | |
HFunctor (These1 f :: (Type -> Type) -> Type -> Type) Source # | |
HBifunctor These1 Source # | |
Generic1 (These1 f g :: Type -> Type) | |
(Functor f, Functor g) => Functor (These1 f g) | |
(Foldable f, Foldable g) => Foldable (These1 f g) | |
Defined in Data.Functor.These fold :: Monoid m => These1 f g m -> m # foldMap :: Monoid m => (a -> m) -> These1 f g a -> m # foldr :: (a -> b -> b) -> b -> These1 f g a -> b # foldr' :: (a -> b -> b) -> b -> These1 f g a -> b # foldl :: (b -> a -> b) -> b -> These1 f g a -> b # foldl' :: (b -> a -> b) -> b -> These1 f g a -> b # foldr1 :: (a -> a -> a) -> These1 f g a -> a # foldl1 :: (a -> a -> a) -> These1 f g a -> a # toList :: These1 f g a -> [a] # null :: These1 f g a -> Bool # length :: These1 f g a -> Int # elem :: Eq a => a -> These1 f g a -> Bool # maximum :: Ord a => These1 f g a -> a # minimum :: Ord a => These1 f g a -> a # | |
(Traversable f, Traversable g) => Traversable (These1 f g) | |
Defined in Data.Functor.These | |
(Arbitrary1 f, Arbitrary1 g) => Arbitrary1 (These1 f g) | |
Defined in Data.Functor.These liftArbitrary :: Gen a -> Gen (These1 f g a) # liftShrink :: (a -> [a]) -> These1 f g a -> [These1 f g a] # | |
(ToJSON1 f, ToJSON1 g) => ToJSON1 (These1 f g) | |
Defined in Data.Functor.These liftToJSON :: (a -> Value) -> ([a] -> Value) -> These1 f g a -> Value # liftToJSONList :: (a -> Value) -> ([a] -> Value) -> [These1 f g a] -> Value # liftToEncoding :: (a -> Encoding) -> ([a] -> Encoding) -> These1 f g a -> Encoding # liftToEncodingList :: (a -> Encoding) -> ([a] -> Encoding) -> [These1 f g a] -> Encoding # | |
(FromJSON1 f, FromJSON1 g) => FromJSON1 (These1 f g) | |
(Eq1 f, Eq1 g) => Eq1 (These1 f g) | |
(Ord1 f, Ord1 g) => Ord1 (These1 f g) | |
Defined in Data.Functor.These | |
(Read1 f, Read1 g) => Read1 (These1 f g) | |
Defined in Data.Functor.These | |
(Show1 f, Show1 g) => Show1 (These1 f g) | |
(NFData1 f, NFData1 g) => NFData1 (These1 f g) | This instance is available only with |
Defined in Data.Functor.These | |
(Eq1 f, Eq1 g, Eq a) => Eq (These1 f g a) | |
(Typeable f, Typeable g, Typeable a, Data (f a), Data (g a)) => Data (These1 f g a) | |
Defined in Data.Functor.These gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> These1 f g a -> c (These1 f g a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (These1 f g a) # toConstr :: These1 f g a -> Constr # dataTypeOf :: These1 f g a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (These1 f g a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (These1 f g a)) # gmapT :: (forall b. Data b => b -> b) -> These1 f g a -> These1 f g a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> These1 f g a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> These1 f g a -> r # gmapQ :: (forall d. Data d => d -> u) -> These1 f g a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> These1 f g a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> These1 f g a -> m (These1 f g a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> These1 f g a -> m (These1 f g a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> These1 f g a -> m (These1 f g a) # | |
(Ord1 f, Ord1 g, Ord a) => Ord (These1 f g a) | |
Defined in Data.Functor.These | |
(Read1 f, Read1 g, Read a) => Read (These1 f g a) | |
(Show1 f, Show1 g, Show a) => Show (These1 f g a) | |
Generic (These1 f g a) | |
(Arbitrary1 f, Arbitrary1 g, Arbitrary a) => Arbitrary (These1 f g a) | |
(ToJSON1 f, ToJSON1 g, ToJSON a) => ToJSON (These1 f g a) | |
Defined in Data.Functor.These | |
(FromJSON1 f, FromJSON1 g, FromJSON a) => FromJSON (These1 f g a) | |
(NFData1 f, NFData1 g, NFData a) => NFData (These1 f g a) | This instance is available only with |
Defined in Data.Functor.These | |
type SF These1 Source # | |
type MF These1 Source # | |
type I These1 Source # | |
type C (These1 f) Source # | |
Defined in Data.HFunctor.Interpret | |
type Rep1 (These1 f g :: Type -> Type) | |
Defined in Data.Functor.These type Rep1 (These1 f g :: Type -> Type) = D1 (MetaData "These1" "Data.Functor.These" "these-1-37K73wV69xaJpdXmERtoQz" False) (C1 (MetaCons "This1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f)) :+: (C1 (MetaCons "That1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g)) :+: C1 (MetaCons "These1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g)))) | |
type Rep (These1 f g a) | |
Defined in Data.Functor.These type Rep (These1 f g a) = D1 (MetaData "These1" "Data.Functor.These" "these-1-37K73wV69xaJpdXmERtoQz" False) (C1 (MetaCons "This1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f a))) :+: (C1 (MetaCons "That1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g a))) :+: C1 (MetaCons "These1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f a)) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g a))))) |
data Comp f g a where Source #
Functor composition.
is equivalent to Comp
f g af (g a)
, and
the Comp
pattern synonym is a way of getting the f (g a)
in
a
.Comp
f g a
For example,
is Maybe
(IO
Bool
)
.Comp
Maybe
IO
Bool
This is mostly useful for its typeclass instances: in particular,
Functor
, Applicative
, HBifunctor
, and
Monoidal
.
This is essentially a version of :.:
and
Compose
that allows for an
HBifunctor
instance.
It is slightly less performant. Using
every once in
a while will concretize a comp
. unComp
Comp
value (if you have
)
and remove some indirection if you have a lot of chained operations.Functor
f
The "free monoid" over Comp
is Free
, and the "free semigroup" over
Comp
is Free1
.
pattern Comp :: Functor f => f (g a) -> Comp f g a | Pattern match on and construct a |
Instances
An HBifunctor
that ignores its second input. Like
a :+:
with no R1
/right branch.
This is Joker
from Data.Bifunctors.Joker, but
given a more sensible name for its purpose.
Instances
HBifunctor (LeftF :: (k2 -> Type) -> (k1 -> Type) -> k2 -> Type) Source # | |
HFunctor (LeftF f :: (k -> Type) -> k -> Type) Source # | |
Semigroupoidal (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Associative appendSF :: LeftF (SF LeftF f) (SF LeftF f) ~> SF LeftF f Source # matchSF :: Functor f => SF LeftF f ~> (f :+: LeftF f (SF LeftF f)) Source # consSF :: LeftF f (SF LeftF f) ~> SF LeftF f Source # toSF :: LeftF f f ~> SF LeftF f Source # biretract :: CS LeftF f => LeftF f f ~> f Source # binterpret :: CS LeftF h => (f ~> h) -> (g ~> h) -> LeftF f g ~> h Source # | |
Associative (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Functor f => Bifunctor (LeftF f :: Type -> Type -> Type) Source # | |
Traversable f => Bitraversable (LeftF f :: Type -> Type -> Type) Source # | |
Defined in Data.HBifunctor bitraverse :: Applicative f0 => (a -> f0 c) -> (b -> f0 d) -> LeftF f a b -> f0 (LeftF f c d) # | |
Foldable f => Bifoldable (LeftF f :: Type -> Type -> Type) Source # | |
Applicative f => Biapplicative (LeftF f :: Type -> Type -> Type) Source # | |
Defined in Data.HBifunctor | |
Functor f => Functor (LeftF f g) Source # | |
Foldable f => Foldable (LeftF f g) Source # | |
Defined in Data.HBifunctor fold :: Monoid m => LeftF f g m -> m # foldMap :: Monoid m => (a -> m) -> LeftF f g a -> m # foldr :: (a -> b -> b) -> b -> LeftF f g a -> b # foldr' :: (a -> b -> b) -> b -> LeftF f g a -> b # foldl :: (b -> a -> b) -> b -> LeftF f g a -> b # foldl' :: (b -> a -> b) -> b -> LeftF f g a -> b # foldr1 :: (a -> a -> a) -> LeftF f g a -> a # foldl1 :: (a -> a -> a) -> LeftF f g a -> a # toList :: LeftF f g a -> [a] # length :: LeftF f g a -> Int # elem :: Eq a => a -> LeftF f g a -> Bool # maximum :: Ord a => LeftF f g a -> a # minimum :: Ord a => LeftF f g a -> a # | |
Traversable f => Traversable (LeftF f g) Source # | |
Eq1 f => Eq1 (LeftF f g) Source # | |
Ord1 f => Ord1 (LeftF f g) Source # | |
Defined in Data.HBifunctor | |
Read1 f => Read1 (LeftF f g) Source # | |
Defined in Data.HBifunctor | |
Show1 f => Show1 (LeftF f g) Source # | |
Eq (f a) => Eq (LeftF f g a) Source # | |
(Typeable g, Typeable a, Typeable f, Typeable k2, Typeable k1, Data (f a)) => Data (LeftF f g a) Source # | |
Defined in Data.HBifunctor gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> LeftF f g a -> c (LeftF f g a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (LeftF f g a) # toConstr :: LeftF f g a -> Constr # dataTypeOf :: LeftF f g a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (LeftF f g a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (LeftF f g a)) # gmapT :: (forall b. Data b => b -> b) -> LeftF f g a -> LeftF f g a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LeftF f g a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LeftF f g a -> r # gmapQ :: (forall d. Data d => d -> u) -> LeftF f g a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> LeftF f g a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) # | |
Ord (f a) => Ord (LeftF f g a) Source # | |
Defined in Data.HBifunctor | |
Read (f a) => Read (LeftF f g a) Source # | |
Show (f a) => Show (LeftF f g a) Source # | |
Generic (LeftF f g a) Source # | |
type SF (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type Rep (LeftF f g a) Source # | |
Defined in Data.HBifunctor |
An HBifunctor
that ignores its first input. Like
a :+:
with no L1
/left branch.
In its polykinded form (on f
), it is essentially a higher-order
version of Tagged
.
Instances
HBifunctor (RightF :: (k1 -> Type) -> (k2 -> Type) -> k2 -> Type) Source # | |
HFunctor (RightF f :: (k1 -> Type) -> k1 -> Type) Source # | |
HFunctor (RightF f :: (k -> Type) -> k -> Type) Source # | |
HBind (RightF f :: (k1 -> Type) -> k1 -> Type) Source # | |
Inject (RightF f :: (k1 -> Type) -> k1 -> Type) Source # | |
Semigroupoidal (RightF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor.Associative appendSF :: RightF (SF RightF f) (SF RightF f) ~> SF RightF f Source # matchSF :: Functor f => SF RightF f ~> (f :+: RightF f (SF RightF f)) Source # consSF :: RightF f (SF RightF f) ~> SF RightF f Source # toSF :: RightF f f ~> SF RightF f Source # biretract :: CS RightF f => RightF f f ~> f Source # binterpret :: CS RightF h => (f ~> h) -> (g ~> h) -> RightF f g ~> h Source # | |
Associative (RightF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
Interpret (RightF f :: (Type -> Type) -> Type -> Type) Source # | |
Functor g => Functor (RightF f g) Source # | |
Foldable g => Foldable (RightF f g) Source # | |
Defined in Data.HBifunctor fold :: Monoid m => RightF f g m -> m # foldMap :: Monoid m => (a -> m) -> RightF f g a -> m # foldr :: (a -> b -> b) -> b -> RightF f g a -> b # foldr' :: (a -> b -> b) -> b -> RightF f g a -> b # foldl :: (b -> a -> b) -> b -> RightF f g a -> b # foldl' :: (b -> a -> b) -> b -> RightF f g a -> b # foldr1 :: (a -> a -> a) -> RightF f g a -> a # foldl1 :: (a -> a -> a) -> RightF f g a -> a # toList :: RightF f g a -> [a] # null :: RightF f g a -> Bool # length :: RightF f g a -> Int # elem :: Eq a => a -> RightF f g a -> Bool # maximum :: Ord a => RightF f g a -> a # minimum :: Ord a => RightF f g a -> a # | |
Traversable g => Traversable (RightF f g) Source # | |
Defined in Data.HBifunctor | |
Eq1 g => Eq1 (RightF f g) Source # | |
Ord1 g => Ord1 (RightF f g) Source # | |
Defined in Data.HBifunctor | |
Read1 g => Read1 (RightF f g) Source # | |
Defined in Data.HBifunctor | |
Show1 g => Show1 (RightF f g) Source # | |
Eq (g a) => Eq (RightF f g a) Source # | |
(Typeable f, Typeable a, Typeable g, Typeable k1, Typeable k2, Data (g a)) => Data (RightF f g a) Source # | |
Defined in Data.HBifunctor gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> RightF f g a -> c (RightF f g a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (RightF f g a) # toConstr :: RightF f g a -> Constr # dataTypeOf :: RightF f g a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (RightF f g a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (RightF f g a)) # gmapT :: (forall b. Data b => b -> b) -> RightF f g a -> RightF f g a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> RightF f g a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> RightF f g a -> r # gmapQ :: (forall d. Data d => d -> u) -> RightF f g a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> RightF f g a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> RightF f g a -> m (RightF f g a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> RightF f g a -> m (RightF f g a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> RightF f g a -> m (RightF f g a) # | |
Ord (g a) => Ord (RightF f g a) Source # | |
Defined in Data.HBifunctor | |
Read (g a) => Read (RightF f g a) Source # | |
Show (g a) => Show (RightF f g a) Source # | |
Generic (RightF f g a) Source # | |
type SF (RightF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # | |
type C (RightF f :: (Type -> Type) -> Type -> Type) Source # | |
Defined in Data.HBifunctor type C (RightF f :: (Type -> Type) -> Type -> Type) = (Unconstrained :: (Type -> Type) -> Constraint) | |
type Rep (RightF f g a) Source # | |
Defined in Data.HBifunctor |
Combinator Combinators
An "HFunctor
combinator" that enhances an HFunctor
with the
ability to hold a single f a
. This is the higher-order analogue of
Lift
.
You can think of it as a free Inject
for any f
.
Instances
HFunctor t => HFunctor (HLift t :: (k -> Type) -> k -> Type) Source # | |
(HBind t, Inject t) => HBind (HLift t :: (k -> Type) -> k -> Type) Source # | |
HFunctor t => Inject (HLift t :: (k -> Type) -> k -> Type) Source # | |
Interpret t => Interpret (HLift t) Source # | Never uses |
(Functor f, Functor (t f)) => Functor (HLift t f) Source # | |
(Eq1 (t f), Eq1 f) => Eq1 (HLift t f) Source # | |
(Ord1 (t f), Ord1 f) => Ord1 (HLift t f) Source # | |
Defined in Data.HFunctor | |
(Show1 (t f), Show1 f) => Show1 (HLift t f) Source # | |
(Eq (f a), Eq (t f a)) => Eq (HLift t f a) Source # | |
(Ord (f a), Ord (t f a)) => Ord (HLift t f a) Source # | |
Defined in Data.HFunctor | |
(Read (f a), Read (t f a)) => Read (HLift t f a) Source # | |
(Show (f a), Show (t f a)) => Show (HLift t f a) Source # | |
type C (HLift t) Source # | |
Defined in Data.HFunctor.Interpret |
An "HFunctor
combinator" that turns an HFunctor
into potentially
infinite nestings of that HFunctor
.
An
is either HFree
t f af a
, t f a
, t (t f) a
, t (t (t f))
a
, etc.
This effectively turns t
into a tree with t
branches.
One particularly useful usage is with MapF
. For example if you had
a data type representing a command line command parser:
data Command a
You could represent "many possible named commands" using
type Commands =MapF
String
Command
And you can represent multiple nested named commands using:
type NestedCommands =HFree
(MapF
String
)
This has an Interpret
instance, but it can be
more useful to use via direct pattern matching, or through
foldHFree
::HBifunctor
t => f~>
g -> t g ~> g -> HFree t f ~> g
which requires no extra constriant on g
, and lets you consider each
branch separately.
This can be considered the higher-oder analogue of
Free
; it is the free HBind
for any
.HFunctor
t
Instances
HFunctor t => HFunctor (HFree t :: (k -> Type) -> k -> Type) Source # | |
HFunctor t => HBind (HFree t :: (k -> Type) -> k -> Type) Source # | |
HFunctor t => Inject (HFree t :: (k -> Type) -> k -> Type) Source # | |
Interpret t => Interpret (HFree t) Source # | Never uses |
(Functor f, Functor (t (HFree t f))) => Functor (HFree t f) Source # | |
(Show1 (t (HFree t f)), Show1 f) => Show1 (HFree t f) Source # | |
(Show1 (t (HFree t f)), Show1 f, Show a) => Show (HFree t f a) Source # | |
type C (HFree t) Source # | |
Defined in Data.HFunctor.Interpret |
Util
Natural Transformations
generalize :: Applicative f => Identity ~> f Source #
Turn Identity
into any
. Can be useful as an
argument to Applicative
fhmap
, hbimap
, or interpret
.
It is a more general form of generalize
from
mmorph.