{-# LANGUAGE Trustworthy #-}{-# LANGUAGE TypeOperators #-}------------------------------------------------------------------------------- |-- Module : Control.Monad.Zip-- Copyright : (c) Nils Schweinsberg 2011,-- (c) George Giorgidze 2011-- (c) University Tuebingen 2011-- License : BSD-style (see the file libraries/base/LICENSE)-- Maintainer : libraries@haskell.org-- Stability : stable-- Portability : portable---- Monadic zipping (used for monad comprehensions)-------------------------------------------------------------------------------moduleGHC.Internal.Control.Monad.Zip (MonadZip (..))whereimportGHC.Internal.Control.Monad (liftM ,liftM2 ,Monad (..))importGHC.Internal.Data.Functor.Identity importqualifiedGHC.Internal.Data.Functor importGHC.Internal.Data.Monoid importGHC.Internal.Data.Ord (Down (..))importGHC.Internal.Data.Proxy importGHC.Internal.Base (NonEmpty (..))--import qualified Data.List.NonEmpty as NEimportGHC.Internal.Generics importqualifiedGHC.Internal.Data.List.NonEmpty asNEimportqualifiedGHC.Internal.Data.List asListimportGHC.Internal.Data.Maybe importGHC.Internal.Data.Tuple --import Prelude-- | Instances should satisfy the laws:---- [Naturality]---- @'liftM' (f 'Control.Arrow.***' g) ('mzip' ma mb)-- = 'mzip' ('liftM' f ma) ('liftM' g mb)@---- [Information Preservation]---- @'liftM' ('Prelude.const' ()) ma = 'liftM' ('Prelude.const' ()) mb@-- implies-- @'munzip' ('mzip' ma mb) = (ma, mb)@--classMonad m =>MonadZip m where{-# MINIMALmzip |mzipWith #-}mzip ::m a ->m b ->m (a ,b )mzip =(a -> b -> (a, b)) -> m a -> m b -> m (a, b)
forall a b c. (a -> b -> c) -> m a -> m b -> m c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith (,)mzipWith ::(a ->b ->c )->m a ->m b ->m c mzipWith a -> b -> c
f m a
ma m b
mb =((a, b) -> c) -> m (a, b) -> m c
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((a -> b -> c) -> (a, b) -> c
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> b -> c
f )(m a -> m b -> m (a, b)
forall a b. m a -> m b -> m (a, b)
forall (m :: * -> *) a b. MonadZip m => m a -> m b -> m (a, b)
mzip m a
ma m b
mb )munzip ::m (a ,b )->(m a ,m b )munzip m (a, b)
mab =(((a, b) -> a) -> m (a, b) -> m a
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (a, b) -> a
forall a b. (a, b) -> a
fst m (a, b)
mab ,((a, b) -> b) -> m (a, b) -> m b
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (a, b) -> b
forall a b. (a, b) -> b
snd m (a, b)
mab )-- munzip is a member of the class because sometimes-- you can implement it more efficiently than the-- above default code. See #4370 comment by giorgidze-- | @since 4.3.1.0instanceMonadZip []wheremzip :: forall a b. [a] -> [b] -> [(a, b)]
mzip =[a] -> [b] -> [(a, b)]
forall a b. [a] -> [b] -> [(a, b)]
List.zip mzipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
mzipWith =(a -> b -> c) -> [a] -> [b] -> [c]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
List.zipWith munzip :: forall a b. [(a, b)] -> ([a], [b])
munzip =[(a, b)] -> ([a], [b])
forall a b. [(a, b)] -> ([a], [b])
List.unzip -- | @since 4.9.0.0instanceMonadZip NonEmpty wheremzip :: forall a b. NonEmpty a -> NonEmpty b -> NonEmpty (a, b)
mzip =NonEmpty a -> NonEmpty b -> NonEmpty (a, b)
forall a b. NonEmpty a -> NonEmpty b -> NonEmpty (a, b)
NE.zip mzipWith :: forall a b c.
(a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
mzipWith =(a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
forall a b c.
(a -> b -> c) -> NonEmpty a -> NonEmpty b -> NonEmpty c
NE.zipWith munzip :: forall a b. NonEmpty (a, b) -> (NonEmpty a, NonEmpty b)
munzip =NonEmpty (a, b) -> (NonEmpty a, NonEmpty b)
forall (f :: * -> *) a b. Functor f => f (a, b) -> (f a, f b)
GHC.Internal.Data.Functor.unzip -- | @since 4.8.0.0instanceMonadZip Identity wheremzipWith :: forall a b c.
(a -> b -> c) -> Identity a -> Identity b -> Identity c
mzipWith =(a -> b -> c) -> Identity a -> Identity b -> Identity c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 munzip :: forall a b. Identity (a, b) -> (Identity a, Identity b)
munzip (Identity (a
a ,b
b ))=(a -> Identity a
forall a. a -> Identity a
Identity a
a ,b -> Identity b
forall a. a -> Identity a
Identity b
b )-- | @since 4.15.0.0instanceMonadZip Solo wheremzipWith :: forall a b c. (a -> b -> c) -> Solo a -> Solo b -> Solo c
mzipWith =(a -> b -> c) -> Solo a -> Solo b -> Solo c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 munzip :: forall a b. Solo (a, b) -> (Solo a, Solo b)
munzip (MkSolo (a
a ,b
b ))=(a -> Solo a
forall a. a -> Solo a
MkSolo a
a ,b -> Solo b
forall a. a -> Solo a
MkSolo b
b )-- | @since 4.8.0.0instanceMonadZip Dual where-- Cannot use coerce, it's unsafemzipWith :: forall a b c. (a -> b -> c) -> Dual a -> Dual b -> Dual c
mzipWith =(a -> b -> c) -> Dual a -> Dual b -> Dual c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip Sum wheremzipWith :: forall a b c. (a -> b -> c) -> Sum a -> Sum b -> Sum c
mzipWith =(a -> b -> c) -> Sum a -> Sum b -> Sum c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip Product wheremzipWith :: forall a b c. (a -> b -> c) -> Product a -> Product b -> Product c
mzipWith =(a -> b -> c) -> Product a -> Product b -> Product c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip Maybe wheremzipWith :: forall a b c. (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
mzipWith =(a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip First wheremzipWith :: forall a b c. (a -> b -> c) -> First a -> First b -> First c
mzipWith =(a -> b -> c) -> First a -> First b -> First c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip Last wheremzipWith :: forall a b c. (a -> b -> c) -> Last a -> Last b -> Last c
mzipWith =(a -> b -> c) -> Last a -> Last b -> Last c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.8.0.0instanceMonadZip f =>MonadZip (Alt f )wheremzipWith :: forall a b c. (a -> b -> c) -> Alt f a -> Alt f b -> Alt f c
mzipWith a -> b -> c
f (Alt f a
ma )(Alt f b
mb )=f c -> Alt f c
forall {k} (f :: k -> *) (a :: k). f a -> Alt f a
Alt ((a -> b -> c) -> f a -> f b -> f c
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith a -> b -> c
f f a
ma f b
mb )-- | @since 4.9.0.0instanceMonadZip Proxy wheremzipWith :: forall a b c. (a -> b -> c) -> Proxy a -> Proxy b -> Proxy c
mzipWith a -> b -> c
_Proxy a
_Proxy b
_=Proxy c
forall {k} (t :: k). Proxy t
Proxy -- Instances for GHC.Generics-- | @since 4.9.0.0instanceMonadZip U1 wheremzipWith :: forall a b c. (a -> b -> c) -> U1 a -> U1 b -> U1 c
mzipWith a -> b -> c
_U1 a
_U1 b
_=U1 c
forall k (p :: k). U1 p
U1 -- | @since 4.9.0.0instanceMonadZip Par1 wheremzipWith :: forall a b c. (a -> b -> c) -> Par1 a -> Par1 b -> Par1 c
mzipWith =(a -> b -> c) -> Par1 a -> Par1 b -> Par1 c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 -- | @since 4.9.0.0instanceMonadZip f =>MonadZip (Rec1 f )wheremzipWith :: forall a b c. (a -> b -> c) -> Rec1 f a -> Rec1 f b -> Rec1 f c
mzipWith a -> b -> c
f (Rec1 f a
fa )(Rec1 f b
fb )=f c -> Rec1 f c
forall k (f :: k -> *) (p :: k). f p -> Rec1 f p
Rec1 ((a -> b -> c) -> f a -> f b -> f c
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith a -> b -> c
f f a
fa f b
fb )-- | @since 4.9.0.0instanceMonadZip f =>MonadZip (M1 i c f )wheremzipWith :: forall a b c.
(a -> b -> c) -> M1 i c f a -> M1 i c f b -> M1 i c f c
mzipWith a -> b -> c
f (M1 f a
fa )(M1 f b
fb )=f c -> M1 i c f c
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 ((a -> b -> c) -> f a -> f b -> f c
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith a -> b -> c
f f a
fa f b
fb )-- | @since 4.9.0.0instance(MonadZip f ,MonadZip g )=>MonadZip (f :*: g )wheremzipWith :: forall a b c.
(a -> b -> c) -> (:*:) f g a -> (:*:) f g b -> (:*:) f g c
mzipWith a -> b -> c
f (f a
x1 :*: g a
y1 )(f b
x2 :*: g b
y2 )=(a -> b -> c) -> f a -> f b -> f c
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith a -> b -> c
f f a
x1 f b
x2 f c -> g c -> (:*:) f g c
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: (a -> b -> c) -> g a -> g b -> g c
forall a b c. (a -> b -> c) -> g a -> g b -> g c
forall (m :: * -> *) a b c.
MonadZip m =>
(a -> b -> c) -> m a -> m b -> m c
mzipWith a -> b -> c
f g a
y1 g b
y2 -- instances for GHC.Internal.Data.Ord-- | @since 4.12.0.0instanceMonadZip Down wheremzipWith :: forall a b c. (a -> b -> c) -> Down a -> Down b -> Down c
mzipWith =(a -> b -> c) -> Down a -> Down b -> Down c
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 

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