{-# LANGUAGE Trustworthy #-}{-# LANGUAGE NoImplicitPrelude #-}{-# LANGUAGE DeriveFunctor #-}{-# LANGUAGE DeriveGeneric #-}{-# LANGUAGE StandaloneDeriving #-}{-# OPTIONS_GHC -Wno-inline-rule-shadowing #-}-- The RULES for the methods of class Arrow may never fire-- e.g. compose/arr; see #10528------------------------------------------------------------------------------- |-- Module : Control.Arrow-- Copyright : (c) Ross Paterson 2002-- License : BSD-style (see the LICENSE file in the distribution)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : portable---- Basic arrow definitions, based on---- * /Generalising Monads to Arrows/, by John Hughes,-- /Science of Computer Programming/ 37, pp67-111, May 2000.---- plus a couple of definitions ('returnA' and 'loop') from---- * /A New Notation for Arrows/, by Ross Paterson, in /ICFP 2001/,-- Firenze, Italy, pp229-240.---- These papers and more information on arrows can be found at-- <http://www.haskell.org/arrows/>.moduleControl.Arrow(-- * ArrowsArrow (..),Kleisli (..),-- ** Derived combinatorsreturnA ,(^>>) ,(>>^) ,(>>>) ,(<<<) ,-- reexported-- ** Right-to-left variants(<<^) ,(^<<) ,-- * Monoid operationsArrowZero (..),ArrowPlus (..),-- * ConditionalsArrowChoice (..),-- * Arrow applicationArrowApply (..),ArrowMonad (..),leftApp ,-- * FeedbackArrowLoop (..))whereimportData.Tuple (fst ,snd ,uncurry )importData.Either importControl.Monad.Fix importControl.Category importGHC.Base hiding((.) ,id )importGHC.Generics (Generic ,Generic1 )infixr5<+> infixr3*** infixr3&&& infixr2+++ infixr2||| infixr1^>> ,>>^ infixr1^<< ,<<^ -- | The basic arrow class.---- Instances should satisfy the following laws:---- * @'arr' id = 'id'@---- * @'arr' (f >>> g) = 'arr' f >>> 'arr' g@---- * @'first' ('arr' f) = 'arr' ('first' f)@---- * @'first' (f >>> g) = 'first' f >>> 'first' g@---- * @'first' f >>> 'arr' 'fst' = 'arr' 'fst' >>> f@---- * @'first' f >>> 'arr' ('id' *** g) = 'arr' ('id' *** g) >>> 'first' f@---- * @'first' ('first' f) >>> 'arr' assoc = 'arr' assoc >>> 'first' f@---- where---- > assoc ((a,b),c) = (a,(b,c))---- The other combinators have sensible default definitions,-- which may be overridden for efficiency.classCategory a =>Arrow a where{-# MINIMALarr ,(first |(***))#-}-- | Lift a function to an arrow.arr ::(b ->c )->a b c -- | Send the first component of the input through the argument-- arrow, and copy the rest unchanged to the output.first ::a b c ->a (b ,d )(c ,d )first =(a b c -> a d d -> a (b, d) (c, d)
forall b c b' c'. a b c -> a b' c' -> a (b, b') (c, c')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** a d d
forall a. a a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id )-- | A mirror image of 'first'.---- The default definition may be overridden with a more efficient-- version if desired.second ::a b c ->a (d ,b )(d ,c )second =(a d d
forall a. a a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id a d d -> a b c -> a (d, b) (d, c)
forall b c b' c'. a b c -> a b' c' -> a (b, b') (c, c')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** )-- | Split the input between the two argument arrows and combine-- their output. Note that this is in general not a functor.---- The default definition may be overridden with a more efficient-- version if desired.(***) ::a b c ->a b' c' ->a (b ,b' )(c ,c' )a b c
f *** a b' c'
g =a b c -> a (b, b') (c, b')
forall b c d. a b c -> a (b, d) (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first a b c
f a (b, b') (c, b') -> a (c, b') (c, c') -> a (b, b') (c, c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ((c, b') -> (b', c)) -> a (c, b') (b', c)
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (c, b') -> (b', c)
forall {b} {a}. (b, a) -> (a, b)
swap a (c, b') (b', c) -> a (b', c) (c, c') -> a (c, b') (c, c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a b' c' -> a (b', c) (c', c)
forall b c d. a b c -> a (b, d) (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first a b' c'
g a (b', c) (c', c) -> a (c', c) (c, c') -> a (b', c) (c, c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ((c', c) -> (c, c')) -> a (c', c) (c, c')
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (c', c) -> (c, c')
forall {b} {a}. (b, a) -> (a, b)
swap whereswap :: (b, a) -> (a, b)
swap ~(b
x ,a
y )=(a
y ,b
x )-- | Fanout: send the input to both argument arrows and combine-- their output.---- The default definition may be overridden with a more efficient-- version if desired.(&&&) ::a b c ->a b c' ->a b (c ,c' )a b c
f &&& a b c'
g =(b -> (b, b)) -> a b (b, b)
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\b
b ->(b
b ,b
b ))a b (b, b) -> a (b, b) (c, c') -> a b (c, c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a b c
f a b c -> a b c' -> a (b, b) (c, c')
forall b c b' c'. a b c -> a b' c' -> a (b, b') (c, c')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** a b c'
g {-# RULES"compose/arr"forallf g .(arr f ). (arr g )=arr (f . g )"first/arr"forallf .first (arr f )=arr (first f )"second/arr"forallf .second (arr f )=arr (second f )"product/arr"forallf g .arr f *** arr g =arr (f *** g )"fanout/arr"forallf g .arr f &&& arr g =arr (f &&& g )"compose/first"forallf g .(first f ). (first g )=first (f . g )"compose/second"forallf g .(second f ). (second g )=second (f . g )#-}-- Ordinary functions are arrows.-- | @since 2.01instanceArrow (->)wherearr :: forall b c. (b -> c) -> b -> c
arr b -> c
f =b -> c
f -- (f *** g) ~(x,y) = (f x, g y)-- sorry, although the above defn is fully H'98, nhc98 can't parse it.*** :: forall b c b' c'. (b -> c) -> (b' -> c') -> (b, b') -> (c, c')
(***) b -> c
f b' -> c'
g ~(b
x ,b'
y )=(b -> c
f b
x ,b' -> c'
g b'
y )-- | Kleisli arrows of a monad.newtypeKleisli m a b =Kleisli {forall (m :: * -> *) a b. Kleisli m a b -> a -> m b
runKleisli ::a ->m b }-- | @since 4.14.0.0derivinginstanceGeneric (Kleisli m a b )-- | @since 4.14.0.0derivinginstanceGeneric1 (Kleisli m a )-- | @since 4.14.0.0derivinginstanceFunctor m =>Functor (Kleisli m a )-- | @since 4.14.0.0instanceApplicative m =>Applicative (Kleisli m a )wherepure :: forall a. a -> Kleisli m a a
pure =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a)
-> (a -> a -> m a) -> a -> Kleisli m a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. m a -> a -> m a
forall a b. a -> b -> a
const (m a -> a -> m a) -> (a -> m a) -> a -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure {-# INLINEpure #-}Kleisli a -> m (a -> b)
f <*> :: forall a b. Kleisli m a (a -> b) -> Kleisli m a a -> Kleisli m a b
<*> Kleisli a -> m a
g =(a -> m b) -> Kleisli m a b
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m b) -> Kleisli m a b) -> (a -> m b) -> Kleisli m a b
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m (a -> b)
f a
x m (a -> b) -> m a -> m b
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> m a
g a
x {-# INLINE(<*>)#-}Kleisli a -> m a
f *> :: forall a b. Kleisli m a a -> Kleisli m a b -> Kleisli m a b
*> Kleisli a -> m b
g =(a -> m b) -> Kleisli m a b
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m b) -> Kleisli m a b) -> (a -> m b) -> Kleisli m a b
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m a
f a
x m a -> m b -> m b
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> a -> m b
g a
x {-# INLINE(*>)#-}Kleisli a -> m a
f <* :: forall a b. Kleisli m a a -> Kleisli m a b -> Kleisli m a a
<* Kleisli a -> m b
g =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a) -> (a -> m a) -> Kleisli m a a
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m a
f a
x m a -> m b -> m a
forall a b. m a -> m b -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* a -> m b
g a
x {-# INLINE(<*)#-}-- | @since 4.14.0.0instanceAlternative m =>Alternative (Kleisli m a )whereempty :: forall a. Kleisli m a a
empty =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a) -> (a -> m a) -> Kleisli m a a
forall a b. (a -> b) -> a -> b
$ m a -> a -> m a
forall a b. a -> b -> a
const m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty {-# INLINEempty #-}Kleisli a -> m a
f <|> :: forall a. Kleisli m a a -> Kleisli m a a -> Kleisli m a a
<|> Kleisli a -> m a
g =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a) -> (a -> m a) -> Kleisli m a a
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m a
f a
x m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> m a
g a
x {-# INLINE(<|>)#-}-- | @since 4.14.0.0instanceMonad m =>Monad (Kleisli m a )whereKleisli a -> m a
f >>= :: forall a b. Kleisli m a a -> (a -> Kleisli m a b) -> Kleisli m a b
>>= a -> Kleisli m a b
k =(a -> m b) -> Kleisli m a b
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m b) -> Kleisli m a b) -> (a -> m b) -> Kleisli m a b
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m a
f a
x m a -> (a -> m b) -> m b
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
a ->Kleisli m a b -> a -> m b
forall (m :: * -> *) a b. Kleisli m a b -> a -> m b
runKleisli (a -> Kleisli m a b
k a
a )a
x {-# INLINE(>>=)#-}-- | @since 4.14.0.0instanceMonadPlus m =>MonadPlus (Kleisli m a )wheremzero :: forall a. Kleisli m a a
mzero =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a) -> (a -> m a) -> Kleisli m a a
forall a b. (a -> b) -> a -> b
$ m a -> a -> m a
forall a b. a -> b -> a
const m a
forall a. m a
forall (m :: * -> *) a. MonadPlus m => m a
mzero {-# INLINEmzero #-}Kleisli a -> m a
f mplus :: forall a. Kleisli m a a -> Kleisli m a a -> Kleisli m a a
`mplus` Kleisli a -> m a
g =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((a -> m a) -> Kleisli m a a) -> (a -> m a) -> Kleisli m a a
forall a b. (a -> b) -> a -> b
$ \a
x ->a -> m a
f a
x m a -> m a -> m a
forall a. m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` a -> m a
g a
x {-# INLINEmplus #-}-- | @since 3.0instanceMonad m =>Category (Kleisli m )whereid :: forall a. Kleisli m a a
id =(a -> m a) -> Kleisli m a a
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kleisli b -> m c
f ). :: forall b c a. Kleisli m b c -> Kleisli m a b -> Kleisli m a c
. (Kleisli a -> m b
g )=(a -> m c) -> Kleisli m a c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\a
b ->a -> m b
g a
b m b -> (b -> m c) -> m c
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> m c
f )-- | @since 2.01instanceMonad m =>Arrow (Kleisli m )wherearr :: forall b c. (b -> c) -> Kleisli m b c
arr b -> c
f =(b -> m c) -> Kleisli m b c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (c -> m c
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> m c) -> (b -> c) -> b -> m c
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> c
f )first :: forall b c d. Kleisli m b c -> Kleisli m (b, d) (c, d)
first (Kleisli b -> m c
f )=((b, d) -> m (c, d)) -> Kleisli m (b, d) (c, d)
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\~(b
b ,d
d )->b -> m c
f b
b m c -> (c -> m (c, d)) -> m (c, d)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \c
c ->(c, d) -> m (c, d)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (c
c ,d
d ))second :: forall b c d. Kleisli m b c -> Kleisli m (d, b) (d, c)
second (Kleisli b -> m c
f )=((d, b) -> m (d, c)) -> Kleisli m (d, b) (d, c)
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\~(d
d ,b
b )->b -> m c
f b
b m c -> (c -> m (d, c)) -> m (d, c)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \c
c ->(d, c) -> m (d, c)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (d
d ,c
c ))-- | The identity arrow, which plays the role of 'return' in arrow notation.returnA ::Arrow a =>a b b returnA :: forall (a :: * -> * -> *) b. Arrow a => a b b
returnA =a b b
forall a. a a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id -- | Precomposition with a pure function.(^>>) ::Arrow a =>(b ->c )->a c d ->a b d b -> c
f ^>> :: forall (a :: * -> * -> *) b c d.
Arrow a =>
(b -> c) -> a c d -> a b d
^>> a c d
a =(b -> c) -> a b c
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr b -> c
f a b c -> a c d -> a b d
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a c d
a -- | Postcomposition with a pure function.(>>^) ::Arrow a =>a b c ->(c ->d )->a b d a b c
a >>^ :: forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> (c -> d) -> a b d
>>^ c -> d
f =a b c
a a b c -> a c d -> a b d
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (c -> d) -> a c d
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr c -> d
f -- | Precomposition with a pure function (right-to-left variant).(<<^) ::Arrow a =>a c d ->(b ->c )->a b d a c d
a <<^ :: forall (a :: * -> * -> *) c d b.
Arrow a =>
a c d -> (b -> c) -> a b d
<<^ b -> c
f =a c d
a a c d -> a b c -> a b d
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
<<< (b -> c) -> a b c
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr b -> c
f -- | Postcomposition with a pure function (right-to-left variant).(^<<) ::Arrow a =>(c ->d )->a b c ->a b d c -> d
f ^<< :: forall (a :: * -> * -> *) c d b.
Arrow a =>
(c -> d) -> a b c -> a b d
^<< a b c
a =(c -> d) -> a c d
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr c -> d
f a c d -> a b c -> a b d
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
<<< a b c
a classArrow a =>ArrowZero a wherezeroArrow ::a b c -- | @since 2.01instanceMonadPlus m =>ArrowZero (Kleisli m )wherezeroArrow :: forall b c. Kleisli m b c
zeroArrow =(b -> m c) -> Kleisli m b c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\b
_->m c
forall a. m a
forall (m :: * -> *) a. MonadPlus m => m a
mzero )-- | A monoid on arrows.classArrowZero a =>ArrowPlus a where-- | An associative operation with identity 'zeroArrow'.(<+>) ::a b c ->a b c ->a b c -- | @since 2.01instanceMonadPlus m =>ArrowPlus (Kleisli m )whereKleisli b -> m c
f <+> :: forall b c. Kleisli m b c -> Kleisli m b c -> Kleisli m b c
<+> Kleisli b -> m c
g =(b -> m c) -> Kleisli m b c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\b
x ->b -> m c
f b
x m c -> m c -> m c
forall a. m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` b -> m c
g b
x )-- | Choice, for arrows that support it. This class underlies the-- @if@ and @case@ constructs in arrow notation.---- Instances should satisfy the following laws:---- * @'left' ('arr' f) = 'arr' ('left' f)@---- * @'left' (f >>> g) = 'left' f >>> 'left' g@---- * @f >>> 'arr' 'Left' = 'arr' 'Left' >>> 'left' f@---- * @'left' f >>> 'arr' ('id' +++ g) = 'arr' ('id' +++ g) >>> 'left' f@---- * @'left' ('left' f) >>> 'arr' assocsum = 'arr' assocsum >>> 'left' f@---- where---- > assocsum (Left (Left x)) = Left x-- > assocsum (Left (Right y)) = Right (Left y)-- > assocsum (Right z) = Right (Right z)---- The other combinators have sensible default definitions, which may-- be overridden for efficiency.classArrow a =>ArrowChoice a where{-# MINIMAL(left |(+++))#-}-- | Feed marked inputs through the argument arrow, passing the-- rest through unchanged to the output.left ::a b c ->a (Either b d )(Either c d )left =(a b c -> a d d -> a (Either b d) (Either c d)
forall b c b' c'. a b c -> a b' c' -> a (Either b b') (Either c c')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ a d d
forall a. a a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id )-- | A mirror image of 'left'.---- The default definition may be overridden with a more efficient-- version if desired.right ::a b c ->a (Either d b )(Either d c )right =(a d d
forall a. a a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id a d d -> a b c -> a (Either d b) (Either d c)
forall b c b' c'. a b c -> a b' c' -> a (Either b b') (Either c c')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ )-- | Split the input between the two argument arrows, retagging-- and merging their outputs.-- Note that this is in general not a functor.---- The default definition may be overridden with a more efficient-- version if desired.(+++) ::a b c ->a b' c' ->a (Either b b' )(Either c c' )a b c
f +++ a b' c'
g =a b c -> a (Either b b') (Either c b')
forall b c d. a b c -> a (Either b d) (Either c d)
forall (a :: * -> * -> *) b c d.
ArrowChoice a =>
a b c -> a (Either b d) (Either c d)
left a b c
f a (Either b b') (Either c b')
-> a (Either c b') (Either c c') -> a (Either b b') (Either c c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (Either c b' -> Either b' c) -> a (Either c b') (Either b' c)
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr Either c b' -> Either b' c
forall x y. Either x y -> Either y x
mirror a (Either c b') (Either b' c)
-> a (Either b' c) (Either c c') -> a (Either c b') (Either c c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a b' c' -> a (Either b' c) (Either c' c)
forall b c d. a b c -> a (Either b d) (Either c d)
forall (a :: * -> * -> *) b c d.
ArrowChoice a =>
a b c -> a (Either b d) (Either c d)
left a b' c'
g a (Either b' c) (Either c' c)
-> a (Either c' c) (Either c c') -> a (Either b' c) (Either c c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (Either c' c -> Either c c') -> a (Either c' c) (Either c c')
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr Either c' c -> Either c c'
forall x y. Either x y -> Either y x
mirror wheremirror ::Either x y ->Either y x mirror :: forall x y. Either x y -> Either y x
mirror (Left x
x )=x -> Either y x
forall a b. b -> Either a b
Right x
x mirror (Right y
y )=y -> Either y x
forall a b. a -> Either a b
Left y
y -- | Fanin: Split the input between the two argument arrows and-- merge their outputs.---- The default definition may be overridden with a more efficient-- version if desired.(|||) ::a b d ->a c d ->a (Either b c )d a b d
f ||| a c d
g =a b d
f a b d -> a c d -> a (Either b c) (Either d d)
forall b c b' c'. a b c -> a b' c' -> a (Either b b') (Either c c')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ a c d
g a (Either b c) (Either d d) -> a (Either d d) d -> a (Either b c) d
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (Either d d -> d) -> a (Either d d) d
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr Either d d -> d
forall {a}. Either a a -> a
untag whereuntag :: Either a a -> a
untag (Left a
x )=a
x untag (Right a
y )=a
y {-# RULES"left/arr"forallf .left (arr f )=arr (left f )"right/arr"forallf .right (arr f )=arr (right f )"sum/arr"forallf g .arr f +++ arr g =arr (f +++ g )"fanin/arr"forallf g .arr f ||| arr g =arr (f ||| g )"compose/left"forallf g .left f . left g =left (f . g )"compose/right"forallf g .right f . right g =right (f . g )#-}-- | @since 2.01instanceArrowChoice (->)whereleft :: forall b c d. (b -> c) -> Either b d -> Either c d
left b -> c
f =b -> c
f (b -> c) -> (d -> d) -> Either b d -> Either c d
forall b c b' c'.
(b -> c) -> (b' -> c') -> Either b b' -> Either c c'
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ d -> d
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id right :: forall b c d. (b -> c) -> Either d b -> Either d c
right b -> c
f =d -> d
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (d -> d) -> (b -> c) -> Either d b -> Either d c
forall b c b' c'.
(b -> c) -> (b' -> c') -> Either b b' -> Either c c'
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ b -> c
f b -> c
f +++ :: forall b c b' c'.
(b -> c) -> (b' -> c') -> Either b b' -> Either c c'
+++ b' -> c'
g =(c -> Either c c'
forall a b. a -> Either a b
Left (c -> Either c c') -> (b -> c) -> b -> Either c c'
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> c
f )(b -> Either c c')
-> (b' -> Either c c') -> Either b b' -> Either c c'
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| (c' -> Either c c'
forall a b. b -> Either a b
Right (c' -> Either c c') -> (b' -> c') -> b' -> Either c c'
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b' -> c'
g )||| :: forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
(|||) =(b -> d) -> (c -> d) -> Either b c -> d
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
either -- | @since 2.01instanceMonad m =>ArrowChoice (Kleisli m )whereleft :: forall b c d. Kleisli m b c -> Kleisli m (Either b d) (Either c d)
left Kleisli m b c
f =Kleisli m b c
f Kleisli m b c
-> Kleisli m d d -> Kleisli m (Either b d) (Either c d)
forall b c b' c'.
Kleisli m b c
-> Kleisli m b' c' -> Kleisli m (Either b b') (Either c c')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ (d -> d) -> Kleisli m d d
forall b c. (b -> c) -> Kleisli m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr d -> d
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id right :: forall b c d. Kleisli m b c -> Kleisli m (Either d b) (Either d c)
right Kleisli m b c
f =(d -> d) -> Kleisli m d d
forall b c. (b -> c) -> Kleisli m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr d -> d
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id Kleisli m d d
-> Kleisli m b c -> Kleisli m (Either d b) (Either d c)
forall b c b' c'.
Kleisli m b c
-> Kleisli m b' c' -> Kleisli m (Either b b') (Either c c')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
+++ Kleisli m b c
f Kleisli m b c
f +++ :: forall b c b' c'.
Kleisli m b c
-> Kleisli m b' c' -> Kleisli m (Either b b') (Either c c')
+++ Kleisli m b' c'
g =(Kleisli m b c
f Kleisli m b c
-> Kleisli m c (Either c c') -> Kleisli m b (Either c c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (c -> Either c c') -> Kleisli m c (Either c c')
forall b c. (b -> c) -> Kleisli m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr c -> Either c c'
forall a b. a -> Either a b
Left )Kleisli m b (Either c c')
-> Kleisli m b' (Either c c')
-> Kleisli m (Either b b') (Either c c')
forall b d c.
Kleisli m b d -> Kleisli m c d -> Kleisli m (Either b c) d
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| (Kleisli m b' c'
g Kleisli m b' c'
-> Kleisli m c' (Either c c') -> Kleisli m b' (Either c c')
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (c' -> Either c c') -> Kleisli m c' (Either c c')
forall b c. (b -> c) -> Kleisli m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr c' -> Either c c'
forall a b. b -> Either a b
Right )Kleisli b -> m d
f ||| :: forall b d c.
Kleisli m b d -> Kleisli m c d -> Kleisli m (Either b c) d
||| Kleisli c -> m d
g =(Either b c -> m d) -> Kleisli m (Either b c) d
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((b -> m d) -> (c -> m d) -> Either b c -> m d
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
either b -> m d
f c -> m d
g )-- | Some arrows allow application of arrow inputs to other inputs.-- Instances should satisfy the following laws:---- * @'first' ('arr' (\\x -> 'arr' (\\y -> (x,y)))) >>> 'app' = 'id'@---- * @'first' ('arr' (g >>>)) >>> 'app' = 'second' g >>> 'app'@---- * @'first' ('arr' (>>> h)) >>> 'app' = 'app' >>> h@---- Such arrows are equivalent to monads (see 'ArrowMonad').classArrow a =>ArrowApply a whereapp ::a (a b c ,b )c -- | @since 2.01instanceArrowApply (->)whereapp :: forall b c. (b -> c, b) -> c
app (b -> c
f ,b
x )=b -> c
f b
x -- | @since 2.01instanceMonad m =>ArrowApply (Kleisli m )whereapp :: forall b c. Kleisli m (Kleisli m b c, b) c
app =((Kleisli m b c, b) -> m c) -> Kleisli m (Kleisli m b c, b) c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (\(Kleisli b -> m c
f ,b
x )->b -> m c
f b
x )-- | The 'ArrowApply' class is equivalent to 'Monad': any monad gives rise-- to a 'Kleisli' arrow, and any instance of 'ArrowApply' defines a monad.newtypeArrowMonad a b =ArrowMonad (a ()b )-- | @since 4.6.0.0instanceArrow a =>Functor (ArrowMonad a )wherefmap :: forall a b. (a -> b) -> ArrowMonad a a -> ArrowMonad a b
fmap a -> b
f (ArrowMonad a () a
m )=a () b -> ArrowMonad a b
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad (a () b -> ArrowMonad a b) -> a () b -> ArrowMonad a b
forall a b. (a -> b) -> a -> b
$ a () a
m a () a -> a a b -> a () b
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (a -> b) -> a a b
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr a -> b
f -- | @since 4.6.0.0instanceArrow a =>Applicative (ArrowMonad a )wherepure :: forall a. a -> ArrowMonad a a
pure a
x =a () a -> ArrowMonad a a
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad ((() -> a) -> a () a
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (a -> () -> a
forall a b. a -> b -> a
const a
x ))ArrowMonad a () (a -> b)
f <*> :: forall a b.
ArrowMonad a (a -> b) -> ArrowMonad a a -> ArrowMonad a b
<*> ArrowMonad a () a
x =a () b -> ArrowMonad a b
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad (a () (a -> b)
f a () (a -> b) -> a () a -> a () (a -> b, a)
forall b c c'. a b c -> a b c' -> a b (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& a () a
x a () (a -> b, a) -> a (a -> b, a) b -> a () b
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> ((a -> b, a) -> b) -> a (a -> b, a) b
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (((a -> b) -> a -> b) -> (a -> b, a) -> b
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (a -> b) -> a -> b
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id ))-- | @since 2.01instanceArrowApply a =>Monad (ArrowMonad a )whereArrowMonad a () a
m >>= :: forall a b.
ArrowMonad a a -> (a -> ArrowMonad a b) -> ArrowMonad a b
>>= a -> ArrowMonad a b
f =a () b -> ArrowMonad a b
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad (a () b -> ArrowMonad a b) -> a () b -> ArrowMonad a b
forall a b. (a -> b) -> a -> b
$ a () a
m a () a -> a a b -> a () b
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (a -> (a () b, ())) -> a a (a () b, ())
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\a
x ->letArrowMonad a () b
h =a -> ArrowMonad a b
f a
x in(a () b
h ,()))a a (a () b, ()) -> a (a () b, ()) b -> a a b
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a (a () b, ()) b
forall b c. a (a b c, b) c
forall (a :: * -> * -> *) b c. ArrowApply a => a (a b c, b) c
app -- | @since 4.6.0.0instanceArrowPlus a =>Alternative (ArrowMonad a )whereempty :: forall a. ArrowMonad a a
empty =a () a -> ArrowMonad a a
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad a () a
forall b c. a b c
forall (a :: * -> * -> *) b c. ArrowZero a => a b c
zeroArrow ArrowMonad a () a
x <|> :: forall a. ArrowMonad a a -> ArrowMonad a a -> ArrowMonad a a
<|> ArrowMonad a () a
y =a () a -> ArrowMonad a a
forall (a :: * -> * -> *) b. a () b -> ArrowMonad a b
ArrowMonad (a () a
x a () a -> a () a -> a () a
forall b c. a b c -> a b c -> a b c
forall (a :: * -> * -> *) b c.
ArrowPlus a =>
a b c -> a b c -> a b c
<+> a () a
y )-- | @since 4.6.0.0instance(ArrowApply a ,ArrowPlus a )=>MonadPlus (ArrowMonad a )-- | Any instance of 'ArrowApply' can be made into an instance of-- 'ArrowChoice' by defining 'left' = 'leftApp'.leftApp ::ArrowApply a =>a b c ->a (Either b d )(Either c d )leftApp :: forall (a :: * -> * -> *) b c d.
ArrowApply a =>
a b c -> a (Either b d) (Either c d)
leftApp a b c
f =(Either b d -> (a () (Either c d), ()))
-> a (Either b d) (a () (Either c d), ())
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((\b
b ->((() -> b) -> a () b
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\()->b
b )a () b -> a b (Either c d) -> a () (Either c d)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a b c
f a b c -> a c (Either c d) -> a b (Either c d)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (c -> Either c d) -> a c (Either c d)
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr c -> Either c d
forall a b. a -> Either a b
Left ,()))(b -> (a () (Either c d), ()))
-> (d -> (a () (Either c d), ()))
-> Either b d
-> (a () (Either c d), ())
forall b d c. (b -> d) -> (c -> d) -> Either b c -> d
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
||| (\d
d ->((() -> d) -> a () d
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (\()->d
d )a () d -> a d (Either c d) -> a () (Either c d)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (d -> Either c d) -> a d (Either c d)
forall b c. (b -> c) -> a b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr d -> Either c d
forall a b. b -> Either a b
Right ,())))a (Either b d) (a () (Either c d), ())
-> a (a () (Either c d), ()) (Either c d)
-> a (Either b d) (Either c d)
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> a (a () (Either c d), ()) (Either c d)
forall b c. a (a b c, b) c
forall (a :: * -> * -> *) b c. ArrowApply a => a (a b c, b) c
app -- | The 'loop' operator expresses computations in which an output value-- is fed back as input, although the computation occurs only once.-- It underlies the @rec@ value recursion construct in arrow notation.-- 'loop' should satisfy the following laws:---- [/extension/]-- @'loop' ('arr' f) = 'arr' (\\ b -> 'fst' ('fix' (\\ (c,d) -> f (b,d))))@---- [/left tightening/]-- @'loop' ('first' h >>> f) = h >>> 'loop' f@---- [/right tightening/]-- @'loop' (f >>> 'first' h) = 'loop' f >>> h@---- [/sliding/]-- @'loop' (f >>> 'arr' ('id' *** k)) = 'loop' ('arr' ('id' *** k) >>> f)@---- [/vanishing/]-- @'loop' ('loop' f) = 'loop' ('arr' unassoc >>> f >>> 'arr' assoc)@---- [/superposing/]-- @'second' ('loop' f) = 'loop' ('arr' assoc >>> 'second' f >>> 'arr' unassoc)@---- where---- > assoc ((a,b),c) = (a,(b,c))-- > unassoc (a,(b,c)) = ((a,b),c)--classArrow a =>ArrowLoop a whereloop ::a (b ,d )(c ,d )->a b c -- | @since 2.01instanceArrowLoop (->)whereloop :: forall b d c. ((b, d) -> (c, d)) -> b -> c
loop (b, d) -> (c, d)
f b
b =let(c
c ,d
d )=(b, d) -> (c, d)
f (b
b ,d
d )inc
c -- | Beware that for many monads (those for which the '>>=' operation-- is strict) this instance will /not/ satisfy the right-tightening law-- required by the 'ArrowLoop' class.---- @since 2.01instanceMonadFix m =>ArrowLoop (Kleisli m )whereloop :: forall b d c. Kleisli m (b, d) (c, d) -> Kleisli m b c
loop (Kleisli (b, d) -> m (c, d)
f )=(b -> m c) -> Kleisli m b c
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli (((c, d) -> c) -> m (c, d) -> m c
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (c, d) -> c
forall a b. (a, b) -> a
fst (m (c, d) -> m c) -> (b -> m (c, d)) -> b -> m c
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ((c, d) -> m (c, d)) -> m (c, d)
forall a. (a -> m a) -> m a
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix (((c, d) -> m (c, d)) -> m (c, d))
-> (b -> (c, d) -> m (c, d)) -> b -> m (c, d)
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> (c, d) -> m (c, d)
forall {a}. b -> (a, d) -> m (c, d)
f' )wheref' :: b -> (a, d) -> m (c, d)
f' b
x (a, d)
y =(b, d) -> m (c, d)
f (b
x ,(a, d) -> d
forall a b. (a, b) -> b
snd (a, d)
y )

AltStyle によって変換されたページ (->オリジナル) /