base-4.20.0.0: Core data structures and operations
Copyright (c) The University of Glasgow 2001 BSD-style (see the file libraries/base/LICENSE) libraries@haskell.org stable portable Safe Haskell2010

Data.Tuple

Description

Functions associated with the tuple data types.

Synopsis

# Documentation

data Solo a Source #

Solo is the canonical lifted 1-tuple, just like (,) is the canonical lifted 2-tuple (pair) and (,,) is the canonical lifted 3-tuple (triple).

The most important feature of Solo is that it is possible to force its "outside" (usually by pattern matching) without forcing its "inside", because it is defined as a datatype rather than a newtype. One situation where this can be useful is when writing a function to extract a value from a data structure. Suppose you write an implementation of arrays and offer only this function to index into them:

index :: Array a -> Int -> a


Now imagine that someone wants to extract a value from an array and store it in a lazy-valued finite map/dictionary:

insert "hello" (arr index 12) m


This can actually lead to a space leak. The value is not actually extracted from the array until that value (now buried in a map) is forced. That means the entire array may be kept live by just that value! Often, the solution is to use a strict map, or to force the value before storing it, but for some purposes that's undesirable.

One common solution is to include an indexing function that can produce its result in an arbitrary Applicative context:

indexA :: Applicative f => Array a -> Int -> f a


When using indexA in a pure context, Solo serves as a handy Applicative functor to hold the result. You could write a non-leaky version of the above example thus:

case arr indexA 12 of
Solo a -> insert "hello" a m


While such simple extraction functions are the most common uses for unary tuples, they can also be useful for fine-grained control of strict-spined data structure traversals, and for unifying the implementations of lazy and strict mapping functions.

Constructors

 MkSolo a

Bundled Patterns

 pattern Solo :: a -> Solo a Deprecated: The Solo constructor has been renamed to MkSolo to avoid punning.

#### Instances

Instances details
Source #

Since: base-4.15.0.0

Instance details

Methods

mzip :: Solo a -> Solo b -> Solo (a, b) Source #

mzipWith :: (a -> b -> c) -> Solo a -> Solo b -> Solo c Source #

munzip :: Solo (a, b) -> (Solo a, Solo b) Source #

Source #

Since: base-4.18.0.0

Instance details

Defined in Data.Foldable1

Methods

fold1 :: Semigroup m => Solo m -> m Source #

foldMap1 :: Semigroup m => (a -> m) -> Solo a -> m Source #

foldMap1' :: Semigroup m => (a -> m) -> Solo a -> m Source #

maximum :: Ord a => Solo a -> a Source #

minimum :: Ord a => Solo a -> a Source #

head :: Solo a -> a Source #

last :: Solo a -> a Source #

foldrMap1 :: (a -> b) -> (a -> b -> b) -> Solo a -> b Source #

foldlMap1' :: (a -> b) -> (b -> a -> b) -> Solo a -> b Source #

foldlMap1 :: (a -> b) -> (b -> a -> b) -> Solo a -> b Source #

foldrMap1' :: (a -> b) -> (a -> b -> b) -> Solo a -> b Source #

Source #

Since: base-4.15

Instance details

Defined in Data.Functor.Classes

Methods

liftEq :: (a -> b -> Bool) -> Solo a -> Solo b -> Bool Source #

Source #

Since: base-4.15

Instance details

Defined in Data.Functor.Classes

Methods

liftCompare :: (a -> b -> Ordering) -> Solo a -> Solo b -> Ordering Source #

Source #

Since: base-4.15

Instance details

Defined in Data.Functor.Classes

Methods

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (Solo a) Source #

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [Solo a] Source #

Source #

Since: base-4.15

Instance details

Defined in Data.Functor.Classes

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Solo a -> ShowS Source #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Solo a] -> ShowS Source #

Source #

Since: base-4.15

Instance details

Defined in GHC.Internal.Base

Methods

pure :: a -> Solo a Source #

(<*>) :: Solo (a -> b) -> Solo a -> Solo b Source #

liftA2 :: (a -> b -> c) -> Solo a -> Solo b -> Solo c Source #

(*>) :: Solo a -> Solo b -> Solo b Source #

(<*) :: Solo a -> Solo b -> Solo a Source #

Source #

Since: base-4.15

Instance details

Defined in GHC.Internal.Base

Methods

fmap :: (a -> b) -> Solo a -> Solo b Source #

(<$) :: a -> Solo b -> Solo a Source # Source # Since: base-4.15 Instance details Defined in GHC.Internal.Base Methods (>>=) :: Solo a -> (a -> Solo b) -> Solo b Source # (>>) :: Solo a -> Solo b -> Solo b Source # return :: a -> Solo a Source # Source # Since: base-4.15 Instance details Defined in GHC.Internal.Control.Monad.Fix Methods mfix :: (a -> Solo a) -> Solo a Source # Source # Since: base-4.15 Instance details Defined in GHC.Internal.Data.Foldable Methods fold :: Monoid m => Solo m -> m Source # foldMap :: Monoid m => (a -> m) -> Solo a -> m Source # foldMap' :: Monoid m => (a -> m) -> Solo a -> m Source # foldr :: (a -> b -> b) -> b -> Solo a -> b Source # foldr' :: (a -> b -> b) -> b -> Solo a -> b Source # foldl :: (b -> a -> b) -> b -> Solo a -> b Source # foldl' :: (b -> a -> b) -> b -> Solo a -> b Source # foldr1 :: (a -> a -> a) -> Solo a -> a Source # foldl1 :: (a -> a -> a) -> Solo a -> a Source # toList :: Solo a -> [a] Source # null :: Solo a -> Bool Source # length :: Solo a -> Int Source # elem :: Eq a => a -> Solo a -> Bool Source # maximum :: Ord a => Solo a -> a Source # minimum :: Ord a => Solo a -> a Source # sum :: Num a => Solo a -> a Source # product :: Num a => Solo a -> a Source # Source # Since: base-4.15 Instance details Defined in GHC.Internal.Data.Traversable Methods traverse :: Applicative f => (a -> f b) -> Solo a -> f (Solo b) Source # sequenceA :: Applicative f => Solo (f a) -> f (Solo a) Source # mapM :: Monad m => (a -> m b) -> Solo a -> m (Solo b) Source # sequence :: Monad m => Solo (m a) -> m (Solo a) Source # Source # Instance details Defined in GHC.Internal.Generics Associated Types  type Rep1 Solo Since: base-4.15 Instance detailsDefined in GHC.Internal.Generics type Rep1 Solo = D1 ('MetaData "Solo" "GHC.Tuple" "ghc-prim" 'False) (C1 ('MetaCons "MkSolo" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1)) Methods from1 :: Solo a -> Rep1 Solo a Source # to1 :: Rep1 Solo a -> Solo a Source # Monoid a => Monoid (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Base Methods mappend :: Solo a -> Solo a -> Solo a Source # mconcat :: [Solo a] -> Solo a Source # Semigroup a => Semigroup (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Base Methods (<>) :: Solo a -> Solo a -> Solo a Source # sconcat :: NonEmpty (Solo a) -> Solo a Source # stimes :: Integral b => b -> Solo a -> Solo a Source # Data a => Data (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Data.Data Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Solo a -> c (Solo a) Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Solo a) Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Solo a)) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Solo a)) Source # gmapT :: (forall b. Data b => b -> b) -> Solo a -> Solo a Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Solo a -> r Source # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Solo a -> r Source # gmapQ :: (forall d. Data d => d -> u) -> Solo a -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> Solo a -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Solo a -> m (Solo a) Source # Bounded a => Bounded (Solo a) Source # Instance details Defined in GHC.Internal.Enum Methods Enum a => Enum (Solo a) Source # Instance details Defined in GHC.Internal.Enum Methods succ :: Solo a -> Solo a Source # pred :: Solo a -> Solo a Source # toEnum :: Int -> Solo a Source # fromEnum :: Solo a -> Int Source # enumFrom :: Solo a -> [Solo a] Source # enumFromThen :: Solo a -> Solo a -> [Solo a] Source # enumFromTo :: Solo a -> Solo a -> [Solo a] Source # enumFromThenTo :: Solo a -> Solo a -> Solo a -> [Solo a] Source # Generic (Solo a) Source # Instance details Defined in GHC.Internal.Generics Associated Types  type Rep (Solo a) Since: base-4.15 Instance detailsDefined in GHC.Internal.Generics type Rep (Solo a) = D1 ('MetaData "Solo" "GHC.Tuple" "ghc-prim" 'False) (C1 ('MetaCons "MkSolo" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) Methods from :: Solo a -> Rep (Solo a) x Source # to :: Rep (Solo a) x -> Solo a Source # Ix a => Ix (Solo a) Source # Instance details Defined in GHC.Internal.Ix Methods range :: (Solo a, Solo a) -> [Solo a] Source # index :: (Solo a, Solo a) -> Solo a -> Int Source # unsafeIndex :: (Solo a, Solo a) -> Solo a -> Int Source # inRange :: (Solo a, Solo a) -> Solo a -> Bool Source # rangeSize :: (Solo a, Solo a) -> Int Source # unsafeRangeSize :: (Solo a, Solo a) -> Int Source # Read a => Read (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Read Methods readsPrec :: Int -> ReadS (Solo a) Source # Show a => Show (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Show Methods showsPrec :: Int -> Solo a -> ShowS Source # show :: Solo a -> String Source # showList :: [Solo a] -> ShowS Source # Eq a => Eq (Solo a) Source # Instance details Defined in GHC.Classes Methods (==) :: Solo a -> Solo a -> Bool Source # (/=) :: Solo a -> Solo a -> Bool Source # Ord a => Ord (Solo a) Source # Instance details Defined in GHC.Classes Methods compare :: Solo a -> Solo a -> Ordering Source # (<) :: Solo a -> Solo a -> Bool Source # (<=) :: Solo a -> Solo a -> Bool Source # (>) :: Solo a -> Solo a -> Bool Source # (>=) :: Solo a -> Solo a -> Bool Source # max :: Solo a -> Solo a -> Solo a Source # min :: Solo a -> Solo a -> Solo a Source # type Rep1 Solo Source # Since: base-4.15 Instance details Defined in GHC.Internal.Generics type Rep1 Solo = D1 ('MetaData "Solo" "GHC.Tuple" "ghc-prim" 'False) (C1 ('MetaCons "MkSolo" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1)) type Rep (Solo a) Source # Since: base-4.15 Instance details Defined in GHC.Internal.Generics type Rep (Solo a) = D1 ('MetaData "Solo" "GHC.Tuple" "ghc-prim" 'False) (C1 ('MetaCons "MkSolo" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) getSolo :: Solo a -> a Source # Extract the value from a Solo. Very often, values should be extracted directly using pattern matching, to control just what gets evaluated when. getSolo is for convenience in situations where that is not the case: When the result is passed to a strict function, it makes no difference whether the pattern matching is done on the "outside" or on the "inside": Data.Set.insert (getSolo sol) set === case sol of Solo v -> Data.Set.insert v set  A traversal may be performed in Solo in order to control evaluation internally, while using getSolo to extract the final result. A strict mapping function, for example, could be defined map' :: Traversable t => (a -> b) -> t a -> t b map' f = getSolo . traverse ((Solo$!) . f)


fst :: (a, b) -> a Source #

Extract the first component of a pair.

snd :: (a, b) -> b Source #

Extract the second component of a pair.

curry :: ((a, b) -> c) -> a -> b -> c Source #

Convert an uncurried function to a curried function.

#### Examples

Expand
>>> curry fst 1 2
1


uncurry :: (a -> b -> c) -> (a, b) -> c Source #

uncurry converts a curried function to a function on pairs.

#### Examples

Expand
>>> uncurry (+) (1,2)
3

>>> uncurry (\$) (show, 1)
"1"

>>> map (uncurry max) [(1,2), (3,4), (6,8)]
[2,4,8]


swap :: (a, b) -> (b, a) Source #

Swap the components of a pair.