HORIZON HASKELLDocslts/ghc-9.14.x3e2d5682026-10-11Search names, modules, packages, or :: a typeCtrl K

GHC 9.14.1 · lts/ghc-9.14.x · 3e2d568 · 2026-10-11

ModuleMonadRandom-0.6.2.1Haskell2010

Control.Monad.Random.Strict

Random monads that are strict in the generator state. For a lazy version, see Control.Monad.Random.Lazy, which has the same interface.

  • 4 types
  • 14 classes
  • 76 values

The Rand monad transformer

8 declarations
typetype Rand g = RandT g Identity
#

A random monad parameterized by the type g of the generator to carry.

The return function leaves the generator unchanged, while >>= uses the final generator of the first computation as the initial generator of the second.

valueliftRand
  1. :: (g -> (a, g))

    pure random transformer

  2. -> Rand g a

    equivalent generator-passing computation

#

Construct a random monad computation from a function. (The inverse of runRand.)

valuerunRand
  1. :: Rand g a

    generator-passing computation to execute

  2. -> g

    initial generator

  3. -> (a, g)

    return value and final generator

#

Unwrap a random monad computation as a function. (The inverse of liftRand.)

valueevalRand
  1. :: Rand g a

    generator-passing computation to execute

  2. -> g

    initial generator

  3. -> a

    return value of the random computation

#

Evaluate a random computation with the given initial generator and return the final value, discarding the final generator.

valueexecRand
  1. :: Rand g a

    generator-passing computation to execute

  2. -> g

    initial generator

  3. -> g

    final generator

#

Evaluate a random computation with the given initial generator and return the final generator, discarding the final value.

valuemapRand :: ((a, g) -> (b, g)) -> Rand g a -> Rand g b
#

Map both the return value and final generator of a computation using the given function.

valueevalRandIO :: Rand StdGen a -> IO a
#

Evaluate a random computation in the IO monad, splitting the global standard generator to get a new one for the computation.

The RandT monad transformer

8 declarations
newtypenewtype RandT g (m :: Type -> Type) a
#

A random transformer monad parameterized by:

  • g - The generator.

  • m - The inner monad.

The return function leaves the generator unchanged, while >>= uses the final generator of the first computation as the initial generator of the second.

Instances22MonadRWS, MonadError, MonadReader, MonadState, MonadWriter, MonadSplit, …
valueliftRandT
  1. :: (g -> m (a, g))

    impure random transformer

  2. -> RandT g m a

    equivalent generator-passing computation

#

Construct a random monad computation from an impure function. (The inverse of runRandT.)

valuerunRandT
  1. :: RandT g m a

    generator-passing computation to execute

  2. -> g

    initial generator

  3. -> m (a, g)

    return value and final generator

#

Unwrap a random monad computation as an impure function. (The inverse of liftRandT.)

valueevalRandT :: Monad m => RandT g m a -> g -> m a
#

Evaluate a random computation with the given initial generator and return the final value, discarding the final generator.

valueexecRandT :: Monad m => RandT g m a -> g -> m g
#

Evaluate a random computation with the given initial generator and return the final generator, discarding the final value.

valueevalRandTIO :: MonadIO m => RandT StdGen m a -> m a
#

Evaluate a random computation that is embedded in the IO monad, splitting the global standard generator to get a new one for the computation.

Some convenience re-exports

81 declarations
valuegenByteString :: RandomGen g => Int -> g -> (ByteString, g)
#

Deprecated. In favor of uniformByteString

Generates a ByteString of the specified size using a pure pseudo-random number generator. See uniformByteStringM for the monadic version.

Examples
Example5 expressions
import System.Randomimport Data.ByteStringlet pureGen = mkStdGen 137:seti -Wno-deprecationsunpack . fst . genByteString 10 $ pureGen[51,123,251,37,49,167,90,109,1,4]
valuegetStdRandom :: MonadIO m => (StdGen -> (a, StdGen)) -> m a
#

Uses the supplied function to get a value from the current global random generator, and updates the global generator with the new generator returned by the function. For example, rollDice produces a pseudo-random integer between 1 and 6:

Example2 expressions
rollDice = getStdRandom (randomR (1, 6))replicateM 10 (rollDice :: IO Int)[1,1,1,4,5,6,1,2,2,5]

This is an outdated function and it is recommended to switch to its equivalent applyAtomicGen instead, possibly with the globalStdGen if relying on the global state is acceptable.

Example3 expressions
import System.Random.StatefulrollDice = applyAtomicGen (uniformR (1, 6)) globalStdGenreplicateM 10 (rollDice :: IO Int)[2,1,1,5,4,3,6,6,3,2]
valueinitStdGen :: MonadIO m => m StdGen
#

Initialize StdGen using system entropy (i.e. /dev/urandom) when it is available, while falling back on using system time as the seed.

valuerandomIO :: (Random a, MonadIO m) => m a
#

A variant of randomM that uses the global pseudo-random number generator globalStdGen.

Example2 expressions
import Data.IntrandomIO :: IO Int32114794456

This function is equivalent to getStdRandom random and is included in this interface for historical reasons and backwards compatibility. It is recommended to use uniformM instead, possibly with the globalStdGen if relying on the global state is acceptable.

Example2 expressions
import System.Random.StatefuluniformM globalStdGen :: IO Int32-1768545016
valuerandomRIO :: (Random a, MonadIO m) => (a, a) -> m a
#

A variant of randomRM that uses the global pseudo-random number generator globalStdGen

Example1 expression
randomRIO (2020, 2100) :: IO Int2028

Similar to randomIO, this function is equivalent to getStdRandom randomR and is included in this interface for historical reasons and backwards compatibility. It is recommended to use uniformRM instead, possibly with the globalStdGen if relying on the global state is acceptable.

Example2 expressions
import System.Random.StatefuluniformRM (2020, 2100) globalStdGen :: IO Int2044
valueuniformByteString :: RandomGen g => Int -> g -> (ByteString, g)
#

Generates a ByteString of the specified size using a pure pseudo-random number generator. See uniformByteStringM for the monadic version.

Examples
Example4 expressions
import System.Randomimport Data.ByteString (unpack)let pureGen = mkStdGen 137unpack . fst $ uniformByteString 10 pureGen[51,123,251,37,49,167,90,109,1,4]
valueuniformFillMutableByteArray
  1. :: RandomGen g
  2. => MutableByteArray s

    Mutable array to fill with random bytes

  3. -> Int

    Offset into a mutable array from the beginning in number of bytes. Offset will be clamped into the range between 0 and the total size of the mutable array

  4. -> Int

    Number of randomly generated bytes to write into the array. This number will be clamped between 0 and the total size of the array without the offset.

  5. -> g
  6. -> ST s g
#

Fill in a slice of a mutable byte array with randomly generated bytes. This function does not fail, instead it clamps the offset and number of bytes to generate into a valid range.

valueuniformList :: (Uniform a, RandomGen g) => Int -> g -> ([a], g)
#

Produce a list of the supplied length with elements generated uniformly.

See uniformListM for a stateful counterpart.

Examples
Example3 expressions
let gen = mkStdGen 2023import Data.Word (Word16)uniformList 5 gen :: ([Word16], StdGen)([56342,15850,25292,14347,13919],StdGen {unStdGen = SMGen 6446154349414395371 1920468677557965761})
valueuniformListR
  1. :: (UniformRange a, RandomGen g)
  2. => Int
  3. -> (a, a)
  4. -> g
  5. -> ([a], g)
#

Produce a list of the supplied length with elements generated uniformly.

See uniformListM for a stateful counterpart.

Examples
Example2 expressions
let gen = mkStdGen 2023uniformListR 10 (20, 30) gen :: ([Int], StdGen)([26,30,27,24,30,25,27,21,27,27],StdGen {unStdGen = SMGen 12965503083958398648 1920468677557965761})
valueuniformRs :: (UniformRange a, RandomGen g) => (a, a) -> g -> [a]
#

Produce an infinite list of pseudo-random values in a specified range. Same as uniforms, integrates nicely with list fusion. There is no way to recover the final generator, therefore either use split before calling uniformRs or use uniformListR instead.

Similar to randomRs, except it relies on UniformRange type class instead of Random.

Examples
Example2 expressions
let gen = mkStdGen 2023take 5 $ uniformRs (10, 100) gen :: [Int][32,86,21,57,39]
valueuniformShuffleList :: RandomGen g => [a] -> g -> ([a], g)
#

Shuffle elements of a list in a uniformly random order.

Examples
Example1 expression
uniformShuffleList "ELVIS" $ mkStdGen 252("LIVES",StdGen {unStdGen = SMGen 17676540583805057877 5302934877338729551})
valueuniforms :: (Uniform a, RandomGen g) => g -> [a]
#

Produce an infinite list of pseudo-random values. Integrates nicely with list fusion. Naturally, there is no way to recover the final generator, therefore either use split before calling uniforms or use uniformList instead.

Similar to randoms, except it relies on Uniform type class instead of Random

Examples
Example3 expressions
let gen = mkStdGen 2023import Data.Word (Word16)take 5 $ uniforms gen :: [Word16][56342,15850,25292,14347,13919]
valuemkStdGen64 :: Word64 -> StdGen
#

Constructs a StdGen deterministically from a Word64 seed.

The difference between mkStdGen is that mkStdGen64 will work the same on 64-bit and 32-bit architectures, while the former can only use 32-bit of information for initializing the psuedo-random number generator on 32-bit operating systems

valueuniformByteArray
  1. :: RandomGen g
  2. => Bool

    Should byte array be allocated in pinned or unpinned memory.

  3. -> Int

    Number of bytes to generate

  4. -> g

    Pure pseudo-random numer generator

  5. -> (ByteArray, g)
#

Efficiently generates a sequence of pseudo-random bytes in a platform independent manner.

valueseedGenTypeName :: SeedGen g => String
#

This is a function that shows the name of the generator type, which is useful for error reporting.

valuewithSeed :: SeedGen g => Seed g -> (g -> (a, g)) -> (a, Seed g)
#

Helper function that allows for operating directly on the Seed, while supplying a function that uses the pseudo-random number generator that is constructed from that Seed.

Example
Example3 expressions
:set -XTypeApplicationsimport System.RandomwithSeed (nonEmptyToSeed (pure 2024) :: Seed StdGen) (uniform @Int)(1039666877624726199,Seed [0xe9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
valuewithSeedFile
  1. :: (SeedGen g, MonadIO m)
  2. => FilePath
  3. -> Seed g -> m (a, Seed g)
  4. -> m a
#

Read the seed from a file and use it for constructing a pseudo-random number generator. After supplied action has been applied to the constructed generator, the resulting generator will be converted back to a seed and written to the same file.

classclass Random a where
#

The class of types for which random values can be generated. Most instances of Random will produce values that are uniformly distributed on the full range, but for those types without a well-defined "full range" some sensible default subrange will be selected.

Random exists primarily for backwards compatibility with version 1.1 of this library. In new code, use the better specified Uniform and UniformRange instead.

Methods

  • randomR :: RandomGen g => (a, a) -> g -> (a, g)

    Takes a range (lo,hi) and a pseudo-random number generator g, and returns a pseudo-random value uniformly distributed over the closed interval [lo,hi], together with a new generator. It is unspecified what happens if lo>hi, but usually the values will simply get swapped.

    Example3 expressions
    let gen = mkStdGen 26fst $ randomR ('a', 'z') gen'z'fst $ randomR ('a', 'z') gen'z'

    For continuous types there is no requirement that the values lo and hi are ever produced, but they may be, depending on the implementation and the interval.

    There is no requirement to follow the Ord instance and the concept of range can be defined on per type basis. For example product types will treat their values independently:

    Example1 expression
    fst $ randomR (('a', 5.0), ('z', 10.0)) $ mkStdGen 26('z',5.22694980853051)

    In case when a lawful range is desired uniformR should be used instead.

  • random :: RandomGen g => g -> (a, g)

    The same as randomR, but using a default range determined by the type:

    • For bounded types (instances of Bounded, such as Char), the range is normally the whole type.

    • For floating point types, the range is normally the closed interval [0,1].

    • For Integer, the range is (arbitrarily) the range of Int.

  • randomRs :: RandomGen g => (a, a) -> g -> [a]

    Plural variant of randomR, producing an infinite list of pseudo-random values instead of returning a new generator.

  • randoms :: RandomGen g => g -> [a]

    Plural variant of random, producing an infinite list of pseudo-random values instead of returning a new generator.

Instances43Random, …
classclass Finite a where
#

A type class for data with a finite number of inhabitants. This type class is used in the default implementation of System.Random.Stateful.Uniform.

Users are not supposed to write instances of Finite manually. There is a default implementation in terms of Generic instead.

Example4 expressions
:seti -XDeriveGeneric -XDeriveAnyClassimport GHC.Generics (Generic)data MyBool = MyTrue | MyFalse deriving (Generic, Finite)data Action = Code MyBool | Eat (Maybe Bool) | Sleep deriving (Generic, Finite)
Instances23Finite, …
classclass RandomGen g where
#

RandomGen is an interface to pure pseudo-random number generators.

StdGen is the standard RandomGen instance provided by this library.

Methods

Instances8RandomGen, …
newtypenewtype Seed g
#

This is a binary form of pseudo-random number generator's state. It is designed to be safe and easy to use for input/output operations like restoring from file, transmitting over the network, etc.

Constructor is not exported, becasue it is important for implementation to enforce the invariant of the underlying byte array being of the exact same length as the generator has specified in SeedSize. Use mkSeed and unSeed to get access to the raw bytes in a safe manner.

Instances4Eq, Ord, Show, Uniform
  • Eq (Seed g)Defined in random-1.3.1 · System.Random.Internal
  • Ord (Seed g)Defined in random-1.3.1 · System.Random.Internal
  • Show (Seed g)Defined in random-1.3.1 · System.Random.Internal
  • SeedGen g => Uniform (Seed g)Defined in random-1.3.1 · System.Random.Seed · orphan
classclass RandomGen g => SplitGen g where
#

Pseudo-random generators that can be split into two separate and independent psuedo-random generators should provide an instance for this type class.

Historically this functionality was included in the RandomGen type class in the split function, however, few pseudo-random generators possess this property of splittability. This lead the old split function being usually implemented in terms of error.

Methods

  • splitGen :: g -> (g, g)

    Returns two distinct pseudo-random number generators.

    Implementations should take care to ensure that the resulting generators are not correlated.

Instances8SplitGen, …
newtypenewtype StdGen
#

The standard pseudo-random number generator.

Instances8Eq, Show, NFData, RandomGen, SplitGen, SeedGen, …
classclass Uniform a where
#

The class of types for which a uniformly distributed value can be drawn from all possible values of the type.

Instances42Uniform, …
classclass UniformRange a where
#

The class of types for which a uniformly distributed value can be drawn from a range.

Instances45UniformRange, …
classclass (KnownNat (SeedSize g), 1 <= SeedSize g, Typeable g) => SeedGen g where
#

Interface for converting a pure pseudo-random number generator to and from non-empty sequence of bytes. Seeds are stored in Little-Endian order regardless of the platform it is being used on, which provides cross-platform compatibility, while providing optimal performance for the most common platform type.

Conversion to and from a Seed serves as a building block for implementing serialization for any pure or frozen pseudo-random number generator.

It is not trivial to implement platform independence. For this reason this type class has two alternative ways of creating an instance for this class. The easiest way for constructing a platform indepent seed is by converting the inner state of a generator to and from a list of 64 bit words using toSeed64 and fromSeed64 respectively. In that case cross-platform support will be handled automaticaly.

Example6 expressions
:set -XDataKinds -XTypeFamiliesimport Data.Word (Word8, Word32)import Data.Bits ((.|.), shiftR, shiftL)import Data.List.NonEmpty (NonEmpty ((:|)))data FiveByteGen = FiveByteGen Word8 Word32 deriving Show:{instance SeedGen FiveByteGen where  type SeedSize FiveByteGen = 5  fromSeed64 (w64 :| _) =    FiveByteGen (fromIntegral (w64 `shiftR` 32)) (fromIntegral w64)  toSeed64 (FiveByteGen x1 x4) =    let w64 = (fromIntegral x1 `shiftL` 32) .|. fromIntegral x4     in (w64 :| []):}
Example4 expressions
FiveByteGen 0x80 0x01020304FiveByteGen 128 16909060fromSeed (toSeed (FiveByteGen 0x80 0x01020304))FiveByteGen 128 16909060toSeed (FiveByteGen 0x80 0x01020304)Seed [0x04, 0x03, 0x02, 0x01, 0x80]toSeed64 (FiveByteGen 0x80 0x01020304)549772722948 :| []

However, when performance is of utmost importance or default handling of cross platform independence is not sufficient, then an adventurous developer can try implementing conversion into bytes directly with toSeed and fromSeed.

Properties that must hold:

> fromSeed (toSeed gen) == gen
> fromSeed64 (toSeed64 gen) == gen

Note, that there is no requirement for every Seed to roundtrip, eg. this proprty does not even hold for StdGen:

Example2 expressions
let seed = nonEmptyToSeed (0xab :| [0xff00]) :: Seed StdGenseed == toSeed (fromSeed seed)False

Associated types

  • type family SeedSize g :: Nat

    Number of bytes that is required for storing the full state of a pseudo-random number generator. It should be big enough to satisfy the roundtrip property:

    > fromSeed (toSeed gen) == gen
    

Methods

  • fromSeed :: Seed g -> g

    Convert from a binary representation to a pseudo-random number generator

  • toSeed :: g -> Seed g

    Convert to a binary representation of a pseudo-random number generator

  • fromSeed64 :: NonEmpty Word64 -> g

    Construct pseudo-random number generator from a list of words. Whenever list does not have enough bytes to satisfy the SeedSize requirement, it will be padded with zeros. On the other hand when it has more than necessary, extra bytes will be dropped.

    For example if SeedSize is set to 2, then only the lower 16 bits of the first element in the list will be used.

  • toSeed64 :: g -> NonEmpty Word64

    Convert pseudo-random number generator to a list of words

    In case when SeedSize is not a multiple of 8, then the upper bits of the last word in the list will be set to zero.

Instances8SeedGen, …
familytype family SeedSize g :: Nat
#

Number of bytes that is required for storing the full state of a pseudo-random number generator. It should be big enough to satisfy the roundtrip property:

> fromSeed (toSeed gen) == gen
Instances8SeedSize, …
value(=<<) :: Monad m => (a -> m b) -> m a -> m b
#

Same as >>=, but with the arguments interchanged.

as >>= f == f =<< as
valueap :: Monad m => m (a -> b) -> m a -> m b
#

In many situations, the liftM operations can be replaced by uses of ap, which promotes function application.

return f `ap` x1 `ap` ... `ap` xn

is equivalent to

liftM<n> f x1 x2 ... xn
Examples
Example1 expression
pure (\x y z -> x + y * z) `ap` Just 1 `ap` Just 5 `ap` Just 10Just 51
valuejoin :: Monad m => m (m a) -> m a
#

The join function is the conventional monad join operator. It is used to remove one level of monadic structure, projecting its bound argument into the outer level.

'join bss' can be understood as the do expression

do bs <- bss
   bs
Examples
Example1 expression
join [[1, 2, 3], [4, 5, 6], [7, 8, 9]][1,2,3,4,5,6,7,8,9]
Example1 expression
join (Just (Just 3))Just 3

A common use of join is to run an IO computation returned from an GHC.Conc.STM transaction, since GHC.Conc.STM transactions can't perform IO directly. Recall that

GHC.Internal.Conc.atomically :: STM a -> IO a

is used to run GHC.Conc.STM transactions atomically. So, by specializing the types of GHC.Internal.Conc.atomically and join to

GHC.Internal.Conc.atomically :: STM (IO b) -> IO (IO b)
join       :: IO (IO b)  -> IO b

we can compose them as

join . GHC.Internal.Conc.atomically :: STM (IO b) -> IO b

to run an GHC.Conc.STM transaction and the IO action it returns.

valueliftM :: Monad m => (a1 -> r) -> m a1 -> m r
#

Promote a function to a monad. This is equivalent to fmap but specialised to Monads.

valueliftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
#

Promote a function to a monad, scanning the monadic arguments from left to right.

Examples
Example1 expression
liftM2 (+) [0,1] [0,2][0,2,1,3]
Example1 expression
liftM2 (+) (Just 1) NothingNothing
Example1 expression
liftM2 (+) (+ 3) (* 2) 518
valueliftM3 :: Monad m => (a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
#

Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).

valueliftM4
  1. :: Monad m
  2. => a1 -> a2 -> a3 -> a4 -> r
  3. -> m a1
  4. -> m a2
  5. -> m a3
  6. -> m a4
  7. -> m r
#

Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).

valueliftM5
  1. :: Monad m
  2. => a1 -> a2 -> a3 -> a4 -> a5 -> r
  3. -> m a1
  4. -> m a2
  5. -> m a3
  6. -> m a4
  7. -> m a5
  8. -> m r
#

Promote a function to a monad, scanning the monadic arguments from left to right (cf. liftM2).

valuewhen :: Applicative f => Bool -> f () -> f ()
#

Conditional execution of Applicative expressions. For example,

Examples
when debug (putStrLn "Debugging")

will output the string Debugging if the Boolean value debug is True, and otherwise do nothing.

Example1 expression
putStr "pi:" >> when False (print 3.14159)pi:
value(<$!>) :: Monad m => (a -> b) -> m a -> m b
#

Strict version of <$>.

value(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
#

Right-to-left composition of Kleisli arrows. (>=>), with the arguments flipped.

Note how this operator resembles function composition (.):

(.)   ::            (b ->   c) -> (a ->   b) -> a ->   c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
value(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
#

Left-to-right composition of Kleisli arrows.

'(bs >=> cs) a' can be understood as the do expression

do b <- bs a
   cs b

or in terms of (>>=) as

bs a >>= cs
valuefilterM :: Applicative m => (a -> m Bool) -> [a] -> m [a]
#

This generalizes the list-based Data.List.filter function.

runIdentity (filterM (Identity . p) xs) == filter p xs
Examples
Example1 expression
filterM (\x -> do      putStrLn ("Keep: " ++ show x ++ "?")      answer <- getLine      pure (answer == "y"))    [1, 2, 3]Keep: 1?yKeep: 2?nKeep: 3?y[1,3]
Example1 expression
filterM (\x -> do      putStr (show x)      x' <- readLn      pure (x == x'))    [1, 2, 3]122233[2,3]
valuefoldM :: (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b
#

The foldM function is analogous to foldl, except that its result is encapsulated in a monad. Note that foldM works from left-to-right over the list arguments. This could be an issue where (>>) and the `folded function' are not commutative.

foldM f a1 [x1, x2, ..., xm]

==

do
  a2 <- f a1 x1
  a3 <- f a2 x2
  ...
  f am xm

If right-to-left evaluation is required, the input list should be reversed.

Note: foldM is the same as foldlM

valueforever :: Applicative f => f a -> f b
#

Repeat an action indefinitely.

Examples

A common use of forever is to process input from network sockets, System.IO.Handles, and channels (e.g. MVar and Chan).

For example, here is how we might implement an echo server, using forever both to listen for client connections on a network socket and to echo client input on client connection handles:

echoServer :: Socket -> IO ()
echoServer socket = forever $ do
  client <- accept socket
  forkFinally (echo client) (\_ -> hClose client)
  where
    echo :: Handle -> IO ()
    echo client = forever $
      hGetLine client >>= hPutStrLn client

Note that "forever" isn't necessarily non-terminating. If the action is in a MonadPlus and short-circuits after some number of iterations. then forever actually returns mzero, effectively short-circuiting its caller.

valueguard :: Alternative f => Bool -> f ()
#

Conditional failure of Alternative computations. Defined by

guard True  = pure ()
guard False = empty
Examples

Common uses of guard include conditionally signalling an error in an error monad and conditionally rejecting the current choice in an Alternative-based parser.

As an example of signalling an error in the error monad Maybe, consider a safe division function safeDiv x y that returns Nothing when the denominator y is zero and Just (x `div` y) otherwise. For example:

Example1 expression
safeDiv 4 0Nothing
Example1 expression
safeDiv 4 2Just 2

A definition of safeDiv using guards, but not guard:

safeDiv :: Int -> Int -> Maybe Int
safeDiv x y | y /= 0    = Just (x `div` y)
            | otherwise = Nothing

A definition of safeDiv using guard and Monad do-notation:

safeDiv :: Int -> Int -> Maybe Int
safeDiv x y = do
  guard (y /= 0)
  return (x `div` y)
valuemapAndUnzipM :: Applicative m => (a -> m (b, c)) -> [a] -> m ([b], [c])
#

The mapAndUnzipM function maps its first argument over a list, returning the result as a pair of lists. This function is mainly used with complicated data structures or a state monad.

valuemfilter :: MonadPlus m => (a -> Bool) -> m a -> m a
#

Direct MonadPlus equivalent of Data.List.filter.

Examples

The Data.List.filter function is just mfilter specialized to the list monad:

Data.List.filter = ( mfilter :: (a -> Bool) -> [a] -> [a] )

An example using mfilter with the Maybe monad:

Example2 expressions
mfilter odd (Just 1)Just 1mfilter odd (Just 2)Nothing
valuereplicateM :: Applicative m => Int -> m a -> m [a]
#

replicateM n act performs the action act n times, and then returns the list of results.

replicateM n (pure x) == replicate n x
Examples
Example1 expression
replicateM 3 getLinehiheyahiya["hi","heya","hiya"]
Example2 expressions
import Control.Monad.StaterunState (replicateM 3 $ state $ \s -> (s, s + 1)) 1([1,2,3],4)
valueunless :: Applicative f => Bool -> f () -> f ()
#

The reverse of when.

Examples
Example1 expression
do x <- getLine       unless (x == "hi") (putStrLn "hi!")comingupwithexamplesisdifficulthi!
Example1 expression
unless (pi > exp 1) NothingJust ()
valueforM_ :: (Foldable t, Monad m) => t a -> (a -> m b) -> m ()
#

forM_ is mapM_ with its arguments flipped. For a version that doesn't ignore the results see Data.Traversable.forM.

forM_ is just like for_, but specialised to monadic actions.

valuemapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
#

Map each element of a structure to a monadic action, evaluate these actions from left to right, and ignore the results. For a version that doesn't ignore the results see Data.Traversable.mapM.

mapM_ is just like traverse_, but specialised to monadic actions.

valuemsum :: (Foldable t, MonadPlus m) => t (m a) -> m a
#

The sum of a collection of actions using (<|>), generalizing concat.

msum is just like asum, but specialised to MonadPlus.

Examples

Basic usage, using the MonadPlus instance for Maybe:

Example1 expression
msum [Just "Hello", Nothing, Just "World"]Just "Hello"
valuesequence_ :: (Foldable t, Monad m) => t (m a) -> m ()
#

Evaluate each monadic action in the structure from left to right, and ignore the results. For a version that doesn't ignore the results see Data.Traversable.sequence.

sequence_ is just like sequenceA_, but specialised to monadic actions.

valuevoid :: Functor f => f a -> f ()
#

void value discards or ignores the result of evaluation, such as the return value of an System.IO.IO action.

Examples

Replace the contents of a Maybe Int with unit:

Example1 expression
void NothingNothing
Example1 expression
void (Just 3)Just ()

Replace the contents of an Either Int Int with unit, resulting in an Either Int ():

Example1 expression
void (Left 8675309)Left 8675309
Example1 expression
void (Right 8675309)Right ()

Replace every element of a list with unit:

Example1 expression
void [1,2,3][(),(),()]

Replace the second element of a pair with unit:

Example1 expression
void (1,2)(1,())

Discard the result of an System.IO.IO action:

Example1 expression
mapM print [1,2]12[(),()]
Example1 expression
void $ mapM print [1,2]12
valueforM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
#

forM is mapM with its arguments flipped. For a version that ignores the results see Data.Foldable.forM_.

classclass Functor (f :: Type -> Type) where
#

A type f is a Functor if it provides a function fmap which, given any types a and b lets you apply any function from (a -> b) to turn an f a into an f b, preserving the structure of f. Furthermore f needs to adhere to the following:

Identity

fmap id == id

Composition

fmap (f . g) == fmap f . fmap g

Note, that the second law follows from the free theorem of the type fmap and the first law, so you need only check that the former condition holds. See these articles by School of Haskell or David Luposchainsky for an explanation.

Methods

  • fmap :: (a -> b) -> f a -> f b

    fmap is used to apply a function of type (a -> b) to a value of type f a, where f is a functor, to produce a value of type f b. Note that for any type constructor with more than one parameter (e.g., Either), only the last type parameter can be modified with fmap (e.g., b in Either a b).

    Some type constructors with two parameters or more have a Data.Bifunctor instance that allows both the last and the penultimate parameters to be mapped over.

    Examples

    Convert from a Maybe Int to a Maybe String using show:

    Example2 expressions
    fmap show NothingNothingfmap show (Just 3)Just "3"

    Convert from an Either Int Int to an Either Int String using show:

    Example2 expressions
    fmap show (Left 17)Left 17fmap show (Right 17)Right "17"

    Double each element of a list:

    Example1 expression
    fmap (*2) [1,2,3][2,4,6]

    Apply even to the second element of a pair:

    Example1 expression
    fmap even (2,2)(2,True)

    It may seem surprising that the function is only applied to the last element of the tuple compared to the list example above which applies it to every element in the list. To understand, remember that tuples are type constructors with multiple type parameters: a tuple of 3 elements (a,b,c) can also be written (,,) a b c and its Functor instance is defined for Functor ((,,) a b) (i.e., only the third parameter is free to be mapped over with fmap).

    It explains why fmap can be used with tuples containing values of different types as in the following example:

    Example1 expression
    fmap even ("hello", 1.0, 4)("hello",1.0,True)
  • (<$) :: a -> f b -> f ainfixl 4

    Replace all locations in the input with the same value. The default definition is fmap . const, but this may be overridden with a more efficient version.

    Examples

    Perform a computation with Maybe and replace the result with a constant value if it is Just:

    Example2 expressions
    'a' <$ Just 2Just 'a''a' <$ NothingNothing
Instances105Functor, …
  • Functor ComplexDefined in base-4.22.0.0 · Data.Complex
  • Functor FirstDefined in base-4.22.0.0 · Data.Semigroup
  • Functor LastDefined in base-4.22.0.0 · Data.Semigroup
  • Functor MaxDefined in base-4.22.0.0 · Data.Semigroup
  • Functor MinDefined in base-4.22.0.0 · Data.Semigroup
  • Functor ArgDescrDefined in base-4.22.0.0 · System.Console.GetOpt
  • Functor ArgOrderDefined in base-4.22.0.0 · System.Console.GetOpt
  • Functor OptDescrDefined in base-4.22.0.0 · System.Console.GetOpt
  • Functor PutDefined in bytestring-0.12.2.0 · Data.ByteString.Builder.Internal
  • Functor PprMDefined in ghc-boot-th-9.14.1 · GHC.Boot.TH.PprLib
  • Functor NonEmptyDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.NonEmpty · orphan
  • Functor STMDefined in ghc-internal-9.1401.0 · GHC.Internal.Conc.Sync
  • Functor HandlerDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Exception
  • Functor IdentityDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Identity
  • Functor FirstDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Functor LastDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Functor DownDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Ord
  • Functor DualDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Functor ProductDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Functor SumDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Functor ZipListDefined in ghc-internal-9.1401.0 · GHC.Internal.Functor.ZipList
  • Functor NoIODefined in ghc-internal-9.1401.0 · GHC.Internal.GHCi
  • Functor Par1Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor GenClosureDefined in ghc-internal-9.1401.0 · GHC.Internal.Heap.Closures
  • Functor GenStackFieldDefined in ghc-internal-9.1401.0 · GHC.Internal.Heap.Closures
  • Functor GenStackFrameDefined in ghc-internal-9.1401.0 · GHC.Internal.Heap.Closures
  • Functor GenStgStackClosureDefined in ghc-internal-9.1401.0 · GHC.Internal.Heap.Closures
  • Functor MaybeDefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Functor TyVarBndrDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Functor PDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadP
  • Functor ReadPDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadP
  • Functor ReadPrecDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadPrec
  • Functor SoloDefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor IODefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor AnnotDetailsDefined in pretty-1.1.3.6 · Text.PrettyPrint.Annotated.HughesPJ
  • Functor DocDefined in pretty-1.1.3.6 · Text.PrettyPrint.Annotated.HughesPJ
  • Functor SpanDefined in pretty-1.1.3.6 · Text.PrettyPrint.Annotated.HughesPJ
  • Functor ArrayDefined in primitive-0.9.1.0 · Data.Primitive.Array
  • Functor SmallArrayDefined in primitive-0.9.1.0 · Data.Primitive.SmallArray
  • Functor []Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor ProxyDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Proxy
  • Functor U1Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor V1Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (Arg a)Defined in base-4.22.0.0 · Data.Semigroup
  • Functor (Array i)Defined in ghc-internal-9.1401.0 · GHC.Internal.Arr
  • Functor (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.ST.Lazy.Imp
  • Functor (Either a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Either
  • Functor (StateL s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Utils
  • Functor (StateR s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Utils
  • Functor (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.ST
  • Functor (Tuple2 a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor f => Functor (Lift f)Defined in transformers-0.6.1.2 · Control.Applicative.Lift
  • Functor m => Functor (MaybeT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Maybe
  • Monad m => Functor (WrappedMonad m)Defined in base-4.22.0.0 · Control.Applicative
  • Arrow a => Functor (ArrowMonad a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Arrow
  • Functor (Const m)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Const
  • Functor (URec Char)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (URec Double)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (URec Float)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (URec Int)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (URec Word)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (URec (Ptr ()))Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (Tuple3 a b)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor (Constant a)Defined in transformers-0.6.1.2 · Data.Functor.Constant
  • Functor (t m) => Functor (LiftingAccum t m)Defined in mtl-2.3.1 · Control.Monad.Accum
  • Functor (t m) => Functor (LiftingSelect t m)Defined in mtl-2.3.1 · Control.Monad.Select
  • Functor f => Functor (Ap f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Functor f => Functor (Alt f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Functor f => Functor (Rec1 f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor f => Functor (Backwards f)Defined in transformers-0.6.1.2 · Control.Applicative.Backwards

    Derived instance.

  • Functor f => Functor (Reverse f)Defined in transformers-0.6.1.2 · Data.Functor.Reverse

    Derived instance.

  • Functor m => Functor (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Lazy
  • Functor m => Functor (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Strict
  • Functor m => Functor (Kleisli m a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Arrow
  • Functor m => Functor (AccumT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Accum
  • Functor m => Functor (ExceptT e m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Except
  • Functor m => Functor (IdentityT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Identity
  • Functor m => Functor (ReaderT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Reader
  • Functor m => Functor (SelectT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Select
  • Functor m => Functor (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Lazy
  • Functor m => Functor (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Strict
  • Functor m => Functor (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.CPS
  • Functor m => Functor (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Lazy
  • Functor m => Functor (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Strict
  • Monad m => Functor (StateT s m)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Utils
  • Arrow a => Functor (WrappedArrow a b)Defined in base-4.22.0.0 · Control.Applicative
  • (Generic1 f, Functor (Rep1 f)) => Functor (Generically1 f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (K1 i c)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (Tuple4 a b c)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor (ContT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Cont
  • Functor ((->) r)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • (Functor f, Functor g) => Functor (Product f g)Defined in base-4.22.0.0 · Data.Functor.Product
  • (Functor f, Functor g) => Functor (Sum f g)Defined in base-4.22.0.0 · Data.Functor.Sum
  • (Functor f, Functor g) => Functor (f :*: g)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • (Functor f, Functor g) => Functor (f :+: g)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (Tuple5 a b c d)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor f => Functor (M1 i c f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor m => Functor (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.CPS
  • Functor m => Functor (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Lazy
  • Functor m => Functor (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Strict
  • (Functor f, Functor g) => Functor (Compose f g)Defined in base-4.22.0.0 · Data.Functor.Compose
  • (Functor f, Functor g) => Functor (f :.: g)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Functor (Tuple6 a b c d e)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Functor (Tuple7 a b c d e f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
classclass Applicative m => Monad (m :: Type -> Type) where
#

The Monad class defines the basic operations over a monad, a concept from a branch of mathematics known as category theory. From the perspective of a Haskell programmer, however, it is best to think of a monad as an abstract datatype of actions. Haskell's do expressions provide a convenient syntax for writing monadic expressions.

Instances of Monad should satisfy the following:

Left identity

return a >>= k = k a

Right identity

m >>= return = m

Associativity

m >>= (\x -> k x >>= h) = (m >>= k) >>= h

Furthermore, the Monad and Applicative operations should relate as follows:

The above laws imply:

and that pure and (<*>) satisfy the applicative functor laws.

The instances of Monad for GHC.List.List, Maybe and System.IO.IO defined in the Prelude satisfy these laws.

Methods

  • (>>=) :: m a -> (a -> m b) -> m binfixl 1

    Sequentially compose two actions, passing any value produced by the first as an argument to the second.

    'as >>= bs' can be understood as the do expression

    do a <- as
       bs a
    

    An alternative name for this function is 'bind', but some people may refer to it as 'flatMap', which results from it being equivalent to

    \x f -> join (fmap f x) :: Monad m => m a -> (a -> m b) -> m b

    which can be seen as mapping a value with Monad m => m a -> m (m b) and then 'flattening' m (m b) to m b using join.

  • (>>) :: m a -> m b -> m binfixl 1

    Sequentially compose two actions, discarding any value produced by the first, like sequencing operators (such as the semicolon) in imperative languages.

    'as >> bs' can be understood as the do expression

    do as
       bs
    

    or in terms of (>>=) as

    as >>= const bs
  • return :: a -> m a

    Inject a value into the monadic type. This function should not be different from its default implementation as pure. The justification for the existence of this function is merely historic.

Instances67Monad, …
  • Monad ComplexDefined in base-4.22.0.0 · Data.Complex
  • Monad FirstDefined in base-4.22.0.0 · Data.Semigroup
  • Monad LastDefined in base-4.22.0.0 · Data.Semigroup
  • Monad MaxDefined in base-4.22.0.0 · Data.Semigroup
  • Monad MinDefined in base-4.22.0.0 · Data.Semigroup
  • Monad PutDefined in bytestring-0.12.2.0 · Data.ByteString.Builder.Internal
  • Monad PprMDefined in ghc-boot-th-9.14.1 · GHC.Boot.TH.PprLib
  • Monad NonEmptyDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.NonEmpty · orphan
  • Monad STMDefined in ghc-internal-9.1401.0 · GHC.Internal.Conc.Sync
  • Monad IdentityDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Identity
  • Monad FirstDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Monad LastDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Monad DownDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Ord
  • Monad DualDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Monad ProductDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Monad SumDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Monad NoIODefined in ghc-internal-9.1401.0 · GHC.Internal.GHCi
  • Monad Par1Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Monad MaybeDefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Monad QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax
  • Monad PDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadP
  • Monad ReadPDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadP
  • Monad ReadPrecDefined in ghc-internal-9.1401.0 · GHC.Internal.Text.ParserCombinators.ReadPrec
  • Monad SoloDefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Monad IODefined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Monad ArrayDefined in primitive-0.9.1.0 · Data.Primitive.Array
  • Monad SmallArrayDefined in primitive-0.9.1.0 · Data.Primitive.SmallArray
  • Monad []Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Monad ProxyDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Proxy
  • Monad U1Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Monad (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.ST.Lazy.Imp
  • Monad (Either e)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Either
  • Monad (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.ST
  • Monad m => Monad (WrappedMonad m)Defined in base-4.22.0.0 · Control.Applicative
  • Monad m => Monad (MaybeT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Maybe
  • Monoid a => Monad (Tuple2 a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • ArrowApply a => Monad (ArrowMonad a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Arrow
  • Monad (t m) => Monad (LiftingAccum t m)Defined in mtl-2.3.1 · Control.Monad.Accum
  • Monad (t m) => Monad (LiftingSelect t m)Defined in mtl-2.3.1 · Control.Monad.Select
  • Monad f => Monad (Ap f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Monoid
  • Monad f => Monad (Alt f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Semigroup.Internal
  • Monad f => Monad (Rec1 f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Monad m => Monad (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Lazy
  • Monad m => Monad (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Strict
  • Monad m => Monad (Kleisli m a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Arrow
  • Monad m => Monad (StateT s m)Defined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Utils
  • Monad m => Monad (ExceptT e m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Except
  • Monad m => Monad (IdentityT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Identity
  • Monad m => Monad (ReaderT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Reader
  • Monad m => Monad (SelectT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Select
  • Monad m => Monad (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Lazy
  • Monad m => Monad (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Strict
  • Monad m => Monad (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.CPS
  • Monad m => Monad (Reverse m)Defined in transformers-0.6.1.2 · Data.Functor.Reverse

    Derived instance.

  • (Monoid a, Monoid b) => Monad (Tuple3 a b)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • (Monoid w, Functor m, Monad m) => Monad (AccumT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Accum
  • (Monoid w, Monad m) => Monad (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Lazy
  • (Monoid w, Monad m) => Monad (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Strict
  • Monad (ContT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Cont
  • Monad ((->) r)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • (Monad f, Monad g) => Monad (Product f g)Defined in base-4.22.0.0 · Data.Functor.Product
  • (Monad f, Monad g) => Monad (f :*: g)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • (Monoid a, Monoid b, Monoid c) => Monad (Tuple4 a b c)Defined in ghc-internal-9.1401.0 · GHC.Internal.Base
  • Monad f => Monad (M1 i c f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Generics
  • Monad m => Monad (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.CPS
  • (Monoid w, Monad m) => Monad (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Lazy
  • (Monoid w, Monad m) => Monad (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Strict
classclass (Alternative m, Monad m) => MonadPlus (m :: Type -> Type) where
#

Monads that also support choice and failure.

Methods

  • mzero :: m a

    The identity of mplus. It should also satisfy the equations

    mzero >>= f  =  mzero
    v >> mzero   =  mzero

    The default definition is

    mzero = empty
    
  • mplus :: m a -> m a -> m a

    An associative operation. The default definition is

    mplus = (<|>)
    
Instances36MonadPlus, …
classclass Monad m => MonadFail (m :: Type -> Type) where
#

When a value is bound in do-notation, the pattern on the left hand side of <- might not match. In this case, this class provides a function to recover.

A Monad without a MonadFail instance may only be used in conjunction with pattern that always match, such as newtypes, tuples, data types with only a single data constructor, and irrefutable patterns (~pat).

Instances of MonadFail should satisfy the following law: fail s should be a left zero for >>=,

fail s >>= f  =  fail s

If your Monad is also MonadPlus, a popular definition is

fail _ = mzero

fail s should be an action that runs in the monad itself, not an exception (except in instances of MonadIO). In particular, fail should not be implemented in terms of error.

Methods

Instances28MonadFail, …
methodmapM :: Monad m => (a -> m b) -> t a -> m (t b)
#

Map each element of a structure to a monadic action, evaluate these actions from left to right, and collect the results. For a version that ignores the results see Data.Foldable.mapM_.

Examples

mapM is literally a traverse with a type signature restricted to Monad. Its implementation may be more efficient due to additional power of Monad.

methodsequence :: Monad m => t (m a) -> m (t a)
#

Evaluate each monadic action in the structure from left to right, and collect the results. For a version that ignores the results see Data.Foldable.sequence_.

Examples

Basic usage:

The first two examples are instances where the input and and output of sequence are isomorphic.

Example1 expression
sequence $ Right [1,2,3,4][Right 1,Right 2,Right 3,Right 4]
Example1 expression
sequence $ [Right 1,Right 2,Right 3,Right 4]Right [1,2,3,4]

The following examples demonstrate short circuit behavior for sequence.

Example1 expression
sequence $ Left [1,2,3,4]Left [1,2,3,4]
Example1 expression
sequence $ [Left 0, Right 1,Right 2,Right 3,Right 4]Left 0
valuefix :: (a -> a) -> a
#

fix f is the least fixed point of the function f, i.e. the least defined x such that f x = x.

When f is strict, this means that because, by the definition of strictness, f ⊥ = ⊥ and such the least defined fixed point of any strict function is ⊥.

Examples

We can write the factorial function using direct recursion as

Example1 expression
let fac n = if n <= 1 then 1 else n * fac (n-1) in fac 5120

This uses the fact that Haskell’s let introduces recursive bindings. We can rewrite this definition using fix,

Instead of making a recursive call, we introduce a dummy parameter rec; when used within fix, this parameter then refers to fix’s argument, hence the recursion is reintroduced.

Example1 expression
fix (\rec n -> if n <= 1 then 1 else n * rec (n-1)) 5120

Using fix, we can implement versions of repeat as fix . (:) and cycle as fix . (++)

Example1 expression
take 10 $ fix (0:)[0,0,0,0,0,0,0,0,0,0]
Example1 expression
map (fix (\rec n -> if n < 2 then n else rec (n - 1) + rec (n - 2))) [1..10][1,1,2,3,5,8,13,21,34,55]
Implementation Details

The current implementation of fix uses structural sharing

fix f = let x = f x in x

A more straightforward but non-sharing version would look like

fix f = f (fix f)
classclass Monad m => MonadFix (m :: Type -> Type) where
#

Monads having fixed points with a 'knot-tying' semantics. Instances of MonadFix should satisfy the following laws:

Purity

mfix (return . h) = return (fix h)

Left shrinking (or Tightening)

mfix (\x -> a >>= \y -> f x y) = a >>= \y -> mfix (\x -> f x y)

Sliding

mfix (liftM h . f) = liftM h (mfix (f . h))

, for strict

h

.

Nesting

mfix (\x -> mfix (\y -> f x y)) = mfix (\x -> f x x)

This class is used in the translation of the recursive do notation supported by GHC and Hugs.

Methods

  • mfix :: (a -> m a) -> m a

    The fixed point of a monadic computation. mfix f executes the action f only once, with the eventual output fed back as the input. Hence f should not be strict, for then mfix f would diverge.

Instances47MonadFix, …
  • MonadFix ComplexDefined in base-4.22.0.0 · Data.Complex
  • MonadFix FirstDefined in base-4.22.0.0 · Data.Semigroup
  • MonadFix LastDefined in base-4.22.0.0 · Data.Semigroup
  • MonadFix MaxDefined in base-4.22.0.0 · Data.Semigroup
  • MonadFix MinDefined in base-4.22.0.0 · Data.Semigroup
  • MonadFix NonEmptyDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix IdentityDefined in ghc-internal-9.1401.0 · GHC.Internal.Data.Functor.Identity
  • MonadFix FirstDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix LastDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix DownDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix DualDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix ProductDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix SumDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix Par1Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix MaybeDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix QDefined in ghc-internal-9.1401.0 · GHC.Internal.TH.Syntax

    If the function passed to mfix inspects its argument, the resulting action will throw a FixIOException.

  • MonadFix SoloDefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix IODefined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix ArrayDefined in primitive-0.9.1.0 · Data.Primitive.Array
  • MonadFix SmallArrayDefined in primitive-0.9.1.0 · Data.Primitive.SmallArray
  • MonadFix []Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • Monoid a => MonadFix (Tuple2 a)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.ST.Lazy.Imp
  • MonadFix (Either e)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix (ST s)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix m => MonadFix (MaybeT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Maybe
  • MonadFix f => MonadFix (Ap f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix f => MonadFix (Alt f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix f => MonadFix (Rec1 f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix m => MonadFix (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Lazy
  • MonadFix m => MonadFix (RandT g m)Defined in MonadRandom-0.6.2.1 · Control.Monad.Trans.Random.Strict
  • MonadFix m => MonadFix (ExceptT e m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Except
  • MonadFix m => MonadFix (IdentityT m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Identity
  • MonadFix m => MonadFix (ReaderT r m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Reader
  • MonadFix m => MonadFix (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Lazy
  • MonadFix m => MonadFix (StateT s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.State.Strict
  • MonadFix m => MonadFix (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.CPS
  • (Monoid w, Functor m, MonadFix m) => MonadFix (AccumT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Accum
  • (Monoid w, MonadFix m) => MonadFix (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Lazy
  • (Monoid w, MonadFix m) => MonadFix (WriterT w m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.Writer.Strict
  • MonadFix ((->) r)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • (MonadFix f, MonadFix g) => MonadFix (Product f g)Defined in base-4.22.0.0 · Data.Functor.Product
  • (MonadFix f, MonadFix g) => MonadFix (f :*: g)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix f => MonadFix (M1 i c f)Defined in ghc-internal-9.1401.0 · GHC.Internal.Control.Monad.Fix
  • MonadFix m => MonadFix (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.CPS
  • (Monoid w, MonadFix m) => MonadFix (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Lazy
  • (Monoid w, MonadFix m) => MonadFix (RWST r w s m)Defined in transformers-0.6.1.2 · Control.Monad.Trans.RWS.Strict
classclass Monad m => MonadIO (m :: Type -> Type) where
#

Monads in which IO computations may be embedded. Any monad built by applying a sequence of monad transformers to the IO monad will be an instance of this class.

Instances should satisfy the following laws, which state that liftIO is a transformer of monads:

Methods

  • liftIO :: IO a -> m a

    Lift a computation from the IO monad. This allows us to run IO computations in any monadic stack, so long as it supports these kinds of operations (i.e. IO is the base monad for the stack).

    Example
    import Control.Monad.Trans.State -- from the "transformers" library
    
    printState :: Show s => StateT s IO ()
    printState = do
      state <- get
      liftIO $ print state

    Had we omitted liftIO, we would have ended up with this error:

    • Couldn't match type ‘IO’ with ‘StateT s IO’
     Expected type: StateT s IO ()
       Actual type: IO ()

    The important part here is the mismatch between StateT s IO () and IO ().

    Luckily, we know of a function that takes an IO a and returns an (m a): liftIO, enabling us to run the program and see the expected results:

    > evalStateT printState "hello"
    "hello"
    
    > evalStateT printState 3
    3
    
Instances19MonadIO, …
classclass (forall (m :: Type -> Type). Monad m => Monad (t m)) => MonadTrans (t :: (Type -> Type) -> Type -> Type) where
#

The class of monad transformers. For any monad m, the result t m should also be a monad, and lift should be a monad transformation from m to t m, i.e. it should satisfy the following laws:

Since 0.6.0.0 and for GHC 8.6 and later, the requirement that t m be a Monad is enforced by the implication constraint forall m. Monad m => Monad (t m) enabled by the QuantifiedConstraints extension.

Ambiguity error with GHC 9.0 to 9.2.2

These versions of GHC have a bug (https://gitlab.haskell.org/ghc/ghc/-/issues/20582) which causes constraints like

(MonadTrans t, forall m. Monad m => Monad (t m)) => ...

to be reported as ambiguous. For transformers 0.6 and later, this can be fixed by removing the second constraint, which is implied by the first.

Methods

  • lift :: Monad m => m a -> t m a

    Lift a computation from the argument monad to the constructed monad.

Instances17MonadTrans, …