If the first list is not finite, the result is the first list.
Performance considerations
This function takes linear time in the number of elements of the
first list. Thus it is better to associate repeated
applications of (++) to the right (which is the default behaviour):
xs ++ (ys ++ zs) or simply xs ++ ys ++ zs, but not (xs ++ ys) ++ zs.
For the same reason GHC.Internal.Data.List.concat=GHC.Internal.Data.List.foldr(++)[]
has linear performance, while GHC.Internal.Data.List.foldl(++)[] is prone
to quadratic slowdown
asTypeOf is a type-restricted version of const. It is usually
used as an infix operator, and its typing forces its first argument
(which is usually overloaded) to have the same type as the second.
Because - is treated specially in the Haskell grammar,
(-e) is not a section, but an application of prefix negation.
However, (subtractexp) is equivalent to the disallowed section.
gcd x y is the non-negative factor of both x and y of which
every common factor of x and y is also a factor; for example
gcd 4 2 = 2, gcd (-4) 6 = 2, gcd 0 4 = 4. gcd 0 0 = 0.
(That is, the common divisor that is "greatest" in the divisibility
preordering.)
Note: Since for signed fixed-width integer types, absminBound < 0,
the result may be negative if one of the arguments is minBound (and
necessarily is if the other is 0 or minBound) for such types.
reduce is a subsidiary function used only in this module.
It normalises a ratio by dividing both numerator and denominator by
their greatest common divisor.
Returns a [String] representing the current call stack. This
can be useful for debugging.
The implementation uses the call-stack simulation maintained by the
profiler, so it only works if the program was compiled with -prof
and contains suitable SCC annotations (e.g. by using -fprof-auto).
Otherwise, the list returned is likely to be empty or
uninformative.
The value of seq a b is bottom if a is bottom, and
otherwise equal to b. In other words, it evaluates the first
argument a to weak head normal form (WHNF). seq is usually
introduced to improve performance by avoiding unneeded laziness.
A note on evaluation order: the expression seq a b does
not guarantee that a will be evaluated before b.
The only guarantee given by seq is that the both a
and b will be evaluated before seq returns a value.
In particular, this means that b may be evaluated before
a. If you need to guarantee a specific order of evaluation,
you must use the function pseq from the "parallel" package.
The Bounded class is used to name the upper and lower limits of a
type. Ord is not a superclass of Bounded since types that are not
totally ordered may also have upper and lower bounds.
The Bounded class may be derived for any enumeration type;
minBound is the first constructor listed in the data declaration
and maxBound is the last.
Bounded may also be derived for single-constructor datatypes whose
constituent types are in Bounded.
Class Enum defines operations on sequentially ordered types.
The enumFrom... methods are used in Haskell's translation of
arithmetic sequences.
Instances of Enum may be derived for any enumeration type (types
whose constructors have no fields). The nullary constructors are
assumed to be numbered left-to-right by fromEnum from 0 through n-1.
See Chapter 10 of the Haskell Report for more details.
For any type that is an instance of class Bounded as well as Enum,
the following should hold:
fromEnum and toEnum should give a runtime error if the
result value is not representable in the result type.
For example, toEnum 7 :: Bool is an error.
enumFrom x = enumFromTo x maxBound
enumFromThen x y = enumFromThenTo x y bound
where
bound | fromEnum y >= fromEnum x = maxBound
| otherwise = minBound
Used in Haskell's translation of [n,n'..]
with [n,n'..] = enumFromThen n n', a possible implementation being
enumFromThen n n' = n : n' : worker (f x) (f x n'),
worker s v = v : worker s (s v), x = fromEnum n' - fromEnum n and
f n y
| n > 0 = f (n - 1) (succ y)
| n < 0 = f (n + 1) (pred y)
| otherwise = y
Used in Haskell's translation of [n,n'..m] with
[n,n'..m] = enumFromThenTo n n' m, a possible implementation
being enumFromThenTo n n' m = worker (f x) (c x) n m,
x = fromEnum n' - fromEnum n, c x = bool (>=) ((x 0)
f n y
| n > 0 = f (n - 1) (succ y)
| n < 0 = f (n + 1) (pred y)
| otherwise = y
and
worker s c v m
| c v m = v : worker s c (s v) m
| otherwise = []
Enum (Fixeda)Defined in base-4.23.0.0 · Data.Fixed
Recall that, for numeric types, succ and pred typically add and subtract
1, respectively. This is not true in the case of Fixed, whose successor
and predecessor functions intuitively return the "next" and "previous" values
in the enumeration. The results of these functions thus depend on the
resolution of the Fixed value. For example, when enumerating values of
resolution 10^-3 of type Milli = Fixed E3,
Example1 expression
>>> succ (0.000 :: Milli)0.001
and likewise
Example1 expression
>>> pred (0.000 :: Milli)-0.001
In other words, succ and pred increment and decrement a fixed-precision
value by the least amount such that the value's resolution is unchanged.
For example, 10^-12 is the smallest (positive) amount that can be added to
a value of type Pico = Fixed E12 without changing its resolution, and so
Example1 expression
>>> succ (0.000000000000 :: Pico)0.000000000001
and similarly
Example1 expression
>>> pred (0.000000000000 :: Pico)-0.000000000001
This is worth bearing in mind when defining Fixed arithmetic sequences. In
particular, you may be forgiven for thinking the sequence
However, this is not true. On the contrary, similarly to the above
implementations of succ and pred, enumFromTo :: Pico -> Pico -> [Pico]
has a "step size" of 10^-12. Hence, the list [1..10] :: [Pico] has
the form
Trigonometric and hyperbolic functions and related functions.
The Haskell Report defines no laws for Floating. However, (+), (*)
and exp are customarily expected to define an exponential field and have
the following properties:
A constant function, returning the lowest and highest values
that exponent x may assume for a normal x.
The relation to IEEE emin and emax is
floatRange x = (emin + 1, emax + 1).
The function decodeFloat applied to a real floating-point
number returns the significand expressed as an Integer and an
appropriately scaled exponent (an Int). If decodeFloat x
yields (m,n), then x is equal in value to m*b^^n, where b
is the floating-point radix, and furthermore, either m and n
are both zero or else b^(d-1) <= abs m < b^d, where d is
the value of floatDigits x.
In particular, decodeFloat 0 = (0,0). If the type
contains a negative zero, also decodeFloat (-0.0) = (0,0).
The result ofdecodeFloat xis unspecified if either ofisNaN xorisInfinite xisTrue.
encodeFloat performs the inverse of decodeFloat in the
sense that for finite x with the exception of -0.0,
Prelude.uncurryencodeFloat (decodeFloat x) = x.
encodeFloat m n is one of the two closest representable
floating-point numbers to m*b^^n (or ±Infinity if overflow
occurs); usually the closer, but if m contains too many bits,
the result may be rounded in the wrong direction.
exponent corresponds to the second component of decodeFloat.
exponent 0 = 0 and for finite nonzero x,
exponent x = snd (decodeFloat x) + floatDigits x.
If x is a finite floating-point number, it is equal in value to
significand x * b ^^ exponent x, where b is the
floating-point radix.
The behaviour is unspecified on infinite or NaN values.
The first component of decodeFloat, scaled to lie in the open
interval (-1,1), either 0.0 or of absolute value >= 1/b,
where b is the floating-point radix.
The behaviour is unspecified on infinite or NaN values.
a version of arctangent taking two real floating-point arguments.
For real floating x and y, atan2 y x computes the angle
(from the positive x-axis) of the vector from the origin to the
point (x,y). atan2 y x returns a value in the range [-pi,
pi]. It follows the Common Lisp semantics for the origin when
signed zeroes are supported. atan2 y 1, with y in a type
that is RealFloat, should return the same value as atan y.
A default definition of atan2 is provided, but implementors
can provide a more accurate implementation.
Instances8RealFloat, …
RealFloatCDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
RealFloatCFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
RealFloatDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float
RealFloatFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Float
Note that it isn't customarily expected that a type instance of both Num
and Ord implement an ordered ring. Indeed, in base only Integer and
Data.Ratio.Rational do.
Conversion from an Integer.
An integer literal represents the application of the function
fromInteger to the appropriate value of type Integer,
so such literals have type (Num a) => a.
Instances89Num, …
NumIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Num
NumNaturalDefined in ghc-internal-10.0.0 · GHC.Internal.Num
Note that Natural's Num instance isn't a ring: no element but 0 has an
additive inverse. It is a semiring though.
NumEventTypeDefined in ghc-internal-10.0.0 · GHC.Internal.Event.EPoll
NumEventDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Poll
NumUniqueDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Unique
NumCBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCClockDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCLLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCPtrdiffDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCSCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCSUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCSigAtomicDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCSizeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCTimeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCULLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCULongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCUShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumCWcharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
NumIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
NumWordPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
NumHalfWordDefined in ghc-internal-10.0.0 · GHC.Internal.Heap.InfoTable.Types
NumInt16Defined in ghc-internal-10.0.0 · GHC.Internal.Int
NumInt32Defined in ghc-internal-10.0.0 · GHC.Internal.Int
NumInt64Defined in ghc-internal-10.0.0 · GHC.Internal.Int
NumInt8Defined in ghc-internal-10.0.0 · GHC.Internal.Int
NumByteOffsetDefined in ghc-internal-10.0.0 · GHC.Internal.Stack.Constants
NumWordOffsetDefined in ghc-internal-10.0.0 · GHC.Internal.Stack.Constants
NumByteOffsetDefined in ghc-internal-10.0.0 · GHC.Internal.Stack.ConstantsProf
NumWordOffsetDefined in ghc-internal-10.0.0 · GHC.Internal.Stack.ConstantsProf
NumCBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCBlkSizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCCcDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCClockIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCDevDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCFsBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCFsFilCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCGidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCInoDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCKeyDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCModeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCNfdsDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCNlinkDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCOffDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCPidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCRLimDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCSocklenDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCSpeedDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCSsizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCTcflagDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumCUidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumFdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
NumDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
This instance implements IEEE 754 standard with all its usual pitfalls
about NaN, infinities and negative zero.
Neither addition nor multiplication are associative or distributive:
NumFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
This instance implements IEEE 754 standard with all its usual pitfalls
about NaN, infinities and negative zero.
Neither addition nor multiplication are associative or distributive:
Numa => Num (Opab)Defined in base-4.23.0.0 · Data.Functor.Contravariant
Num (fa) => Num (Altfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Semigroup.Internal
Numa => Num (Constab)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Functor.Const
(Applicativef, Numa) => Num (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Note that even if the underlying Num and Applicative instances are
lawful, for most Applicatives, this instance will not be lawful. If you use
this instance with the list Applicative, the following customary laws will
not hold:
Commutativity:
Example2 expressions
>>> Ap [10,20] + Ap [1,2]Ap {getAp = [11,12,21,22]}>>> Ap [1,2] + Ap [10,20]Ap {getAp = [11,21,12,22]}
Additive inverse:
Example2 expressions
>>> Ap [] + negate (Ap [])Ap {getAp = []}>>> fromInteger 0 :: Ap [] IntAp {getAp = [0]}
Distributivity:
Example2 expressions
>>> Ap [1,2] * (3 + 4)Ap {getAp = [7,14]}>>> (Ap [1,2] * 3) + (Ap [1,2] * 4)Ap {getAp = [7,11,10,14]}
Num (f (ga)) => Num (Composefga)Defined in base-4.23.0.0 · Data.Functor.Compose
A value of type FunPtr a is a pointer to a function callable
from foreign code. The type a will normally be a foreign type,
a function type with zero or more arguments where
the return type is either a marshallable foreign type or has the form
IO t where t is a marshallable foreign type or ().
A value of type FunPtr a may be a pointer to a foreign function,
either returned by another foreign function or imported with a
a static address import like
A value of type Ptr a represents a pointer to an object, or an
array of objects, which may be marshalled to or from Haskell values
of type a.
The type a will often be an instance of class
Storable which provides the marshalling operations.
However this is not essential, and you can provide your own operations
to access the pointer. For example you might write small foreign
functions to get or set the fields of a C struct.
The Haskell Report defines no laws for Fractional. However, (+) and
(*) are customarily expected to define a division ring and have the
following properties:
The Haskell Report defines no laws for Integral. However, Integral
instances are customarily expected to define a Euclidean domain and have the
following properties for the div/mod and quot/rem pairs, given
suitable Euclidean functions f and g:
x = y * quot x y + rem x y with rem x y = fromInteger 0 or
g (rem x y) < g y
x = y * div x y + mod x y with mod x y = fromInteger 0 or
f (mod x y) < f y
An example of a suitable Euclidean function, for Integer's instance, is
abs.
In addition, toInteger should be total, and fromInteger should be a left
inverse for it, i.e. fromInteger (toInteger i) = i.
Rational numbers, with numerator and denominator of some Integral type.
Note that Ratio's instances inherit the deficiencies from the type
parameter's. For example, Ratio Natural's Num instance has similar
problems to Numeric.Natural.Natural's.
The law does not hold for Float, Double, CFloat,
CDouble, etc., because these types contain non-finite values,
which cannot be roundtripped through Rational.
Constraint representing the fact that the field x belongs to
the record type r and has field type a. This will be solved
automatically, but manual instances may be provided as well.
Derived instances of Show have the following properties, which
are compatible with derived instances of Text.Read.Read:
The result of show is a syntactically correct Haskell
expression containing only constants, given the fixity
declarations in force at the point where the type is declared.
It contains only the constructor names defined in the data type,
parentheses, and spaces. When labelled constructor fields are
used, braces, commas, field names, and equal signs are also used.
If the constructor is defined to be an infix operator, then
showsPrec will produce infix applications of the constructor.
the representation will be enclosed in parentheses if the
precedence of the top-level constructor in x is less than d
(associativity is ignored). Thus, if d is 0 then the result
is never surrounded in parentheses; if d is 11 it is always
surrounded in parentheses, unless it is an atomic expression.
If the constructor is defined using record syntax, then show
will produce the record-syntax form, with the fields given in the
same order as the original declaration.
For example, given the declarations
infixr 5 :^:
data Tree a = Leaf a | Tree a :^: Tree a
instance (Show a) => Show (Tree a) where
showsPrec d (Leaf m) = showParen (d > app_prec) $
showString "Leaf " . showsPrec (app_prec+1) m
where app_prec = 10
showsPrec d (u :^: v) = showParen (d > up_prec) $
showsPrec (up_prec+1) u .
showString " :^: " .
showsPrec (up_prec+1) v
where up_prec = 5
Note that right-associativity of :^: is ignored. For example,
show (Leaf 1 :^: Leaf 2 :^: Leaf 3) produces the string
"Leaf 1 :^: (Leaf 2 :^: Leaf 3)".
Instances440Show, …
ShowAsyncCancelledDefined in async-2.2.6 · Control.Concurrent.Async.Internal
as a variant of putStrLn that will get its call-site and print it,
along with the string given as argument. We can access the
call-stack inside putStrLnWithCallStack with callStack.
Thus, if we call putStrLnWithCallStack we will get a formatted call-stack
alongside our string.
Example1 expression
>>> putStrLnWithCallStack "hello"helloCallStack (from HasCallStack): putStrLnWithCallStack, called at <interactive>:... in interactive:Ghci...
GHC solves HasCallStack constraints in three steps:
If there is a CallStack in scope -- i.e. the enclosing function
has a HasCallStack constraint -- GHC will append the new
call-site to the existing CallStack.
If there is no CallStack in scope -- e.g. in the GHCi session
above -- and the enclosing definition does not have an explicit
type signature, GHC will infer a HasCallStack constraint for the
enclosing definition (subject to the monomorphism restriction).
If there is no CallStack in scope and the enclosing definition
has an explicit type signature, GHC will solve the HasCallStack
constraint for the singleton CallStack containing just the
current call-site.
CallStacks do not interact with the RTS and do not require compilation
with -prof. On the other hand, as they are built up explicitly via the
HasCallStack constraints, they will generally not contain as much
information as the simulated call-stacks maintained by the RTS.
A CallStack is a [(String, SrcLoc)]. The String is the name of
function that was called, the SrcLoc is the call-site. The list is
ordered with the most recently called function at the head.
NOTE: The intrepid user may notice that HasCallStack is just an
alias for an implicit parameter ?callStack :: CallStack. This is an
implementation detail and should not be considered part of the
CallStack API, we may decide to change the implementation in the
future.
Instances4IsList, Show, NFData, Item
IsListCallStackDefined in ghc-internal-10.0.0 · GHC.Internal.IsList
Be aware that 'fromList . toList = id' only for unfrozen CallStacks,
since toList removes frozenness information.
ShowCallStackDefined in ghc-internal-10.0.0 · GHC.Internal.Show
NOTE: The implicit parameter ?callStack :: CallStack is an
implementation detail and should not be considered part of the
CallStack API, we may decide to change the implementation in the
future.
A value of type IO a is a computation which, when performed,
does some I/O before returning a value of type a.
There is really only one way to "perform" an I/O action: bind it to
Main.main in your program. When your program is run, the I/O will
be performed. It isn't possible to perform I/O from an arbitrary
function, unless that function is itself in the IO monad and called
at some point, directly or indirectly, from Main.main.
IO is a monad, so IO actions can be combined using either the do-notation
or the Prelude.>> and Prelude.>>= operations from the Prelude.Monad
class.
Arbitrary precision integers. In contrast with fixed-size integral types
such as Int, the Integer type represents the entire infinite range of
integers.
Integers are stored in a kind of sign-magnitude form, hence do not expect
two's complement form when using bit operations.
If the value is small (i.e., fits into an Int), the IS constructor is
used. Otherwise IP and IN constructors are used to store a BigNat
representing the positive or the negative value magnitude, respectively.
Invariant: IP and IN are used iff the value does not fit in IS.
Instances18Enum, Eq, Integral, Data, Num, Ord, …
EnumIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Enum
EqIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Bignum.Integer
IntegralIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Real
DataIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Data
NumIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Num
OrdIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Bignum.Integer
ReadIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Read
RealIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Real
ShowIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Show
IxIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Ix
BitsIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Bits
Character literals in Haskell are single-quoted: 'Q', 'Я' or 'Ω'.
To represent a single quote itself use '\'', and to represent a backslash
use '\\'. The full grammar can be found in the section 2.6 of the
Haskell 2010 Language Report.
To specify a character by its code point one can use decimal, hexadecimal
or octal notation: '\65', '\x41' and '\o101' are all alternative forms
of 'A'. The largest code point is '\x10ffff'.
There is a special escape syntax for ASCII control characters:
Coercible is a two-parameter class that has instances for types a and b if
the compiler can infer that they have the same representation. This class
does not have regular instances; instead they are created on-the-fly during
type-checking. Trying to manually declare an instance of Coercible
is an error.
Nevertheless one can pretend that the following three kinds of instances
exist. First, as a trivial base-case:
instance Coercible a a
Furthermore, for every type constructor there is
an instance that allows to coerce under the type constructor. For
example, let D be a prototypical type constructor (data or
newtype) with three type arguments, which have roles nominal,
representational resp. phantom. Then there is an instance of
the form
instance Coercible b b' => Coercible (D a b c) (D a b' c')
Note that the nominal type arguments are equal, the
representational type arguments can differ, but need to have a
Coercible instance themself, and the phantom type arguments can be
changed arbitrarily.
The third kind of instance exists for every newtype NT = MkNT T and
comes in two variants, namely
instance Coercible a T => Coercible a NT
instance Coercible T b => Coercible NT b
This instance is only usable if the constructor MkNT is in scope.
If, as a library author of a type constructor like Set a, you
want to prevent a user of your module to write
coerce :: Set T -> Set NT,
you need to set the role of Set's type parameter to nominal,
by writing
type role Set nominal
For more details about this feature, please refer to
Safe Coercions
by Joachim Breitner, Richard A. Eisenberg, Simon Peyton Jones and Stephanie Weirich.
DataDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Data
NumDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
This instance implements IEEE 754 standard with all its usual pitfalls
about NaN, infinities and negative zero.
Neither addition nor multiplication are associative or distributive:
OrdDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
IEEE 754 Double-precision type includes not only numbers, but also
positive and negative infinities and a special element called NaN
(which can be quiet or signal).
IEEE 754-2008, section 5.11 requires that if at least one of arguments of
<=, <, >, >= is NaN then the result of the comparison is False,
and instanceOrdDouble complies with this requirement. This violates
the reflexivity: both NaN<=NaN and NaN>=NaN are False.
IEEE 754-2008, section 5.10 defines totalOrder predicate. Unfortunately,
compare on Doubles violates the IEEE standard and does not define a total order.
More specifically, both compareNaNx and comparexNaN always return GT.
Thus, users must be extremely cautious when using instanceOrdDouble.
For instance, one should avoid ordered containers with keys represented by Double,
because data loss and corruption may happen. An IEEE-compliant compare is available
in fp-ieee package as TotallyOrdered newtype.
Moving further, the behaviour of min and max with regards to NaN is
also non-compliant. IEEE 754-2008, section 5.3.1 defines that quiet NaN
should be treated as a missing data by minNum and maxNum functions,
for example, minNum(NaN, 1) = minNum(1, NaN) = 1. Some languages such as Java
deviate from the standard implementing minNum(NaN, 1) = minNum(1, NaN) = NaN.
However, min / max in base are even worse: minNaN 1 is 1, but min 1 NaN
is NaN.
IEEE 754-2008 compliant min / max can be found in ieee754 package under
minNum / maxNum names. Implementations compliant with
minimumNumber / maximumNumber from a newer
IEEE 754-2019,
section 9.6 are available from fp-ieee package.
ReadDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Read
RealDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
RealFloatDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float
RealFracDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
Beware that results for non-finite arguments are garbage:
Example2 expressions
>>> [ f x | f <- [round, floor, ceiling], x <- [-1/0, 0/0, 1/0] ] :: [Int][0,0,0,0,0,0,0,0,0]>>> map properFraction [-1/0, 0/0, 1/0] :: [(Int, Double)][(0,0.0),(0,0.0),(0,0.0)]
and get even more non-sensical if you ask for Integer instead of Int.
ShowDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
StorableDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
DataFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Data
NumFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Float · orphan
This instance implements IEEE 754 standard with all its usual pitfalls
about NaN, infinities and negative zero.
Neither addition nor multiplication are associative or distributive:
A fixed-precision integer type with at least the range [-2^29 .. 2^29-1].
The exact range for a given implementation can be determined by using
Prelude.minBound and Prelude.maxBound from the Prelude.Bounded class.
Applying ($) to a function f and an argument x gives the same result as applying f to x directly. The definition is akin to this:
($) :: (a -> b) -> a -> b
($) f x = f x
This is id specialized from a -> a to (a -> b) -> (a -> b) which by the associativity of (->)
is the same as (a -> b) -> a -> b.
On the face of it, this may appear pointless! But it's actually one of the most useful and important operators in Haskell.
The order of operations is very different between ($) and normal function application. Normal function application has precedence 10 - higher than any operator - and associates to the left. So these two definitions are equivalent:
expr = min 5 1 + 5
expr = ((min 5) 1) + 5
($) has precedence 0 (the lowest) and associates to the right, so these are equivalent:
expr = min 5 $ 1 + 5
expr = (min 5) (1 + 5)
Examples
A common use cases of ($) is to avoid parentheses in complex expressions.
For example, instead of using nested parentheses in the following
Haskell function:
-- | Sum numbers in a string: strSum "100 5 -7" == 98
strSum :: String -> Int
strSum s = sum (mapMaybereadMaybe (words s))
we can deploy the function application operator:
-- | Sum numbers in a string: strSum "100 5 -7" == 98
strSum :: String -> Int
strSum s = sum$mapMaybereadMaybe$words s
($) is also used as a section (a partially applied operator), in order to indicate that we wish to apply some yet-unspecified function to a given value. For example, to apply the argument 5 to a list of functions:
& is a reverse application operator. This provides notational
convenience. Its precedence is one higher than that of the forward
application operator $, which allows & to be nested in $.
This is a version of flipid, where id is specialized from a -> a to (a -> b) -> (a -> b)
which by the associativity of (->) is (a -> b) -> a -> b.
flipping this yields a -> (a -> b) -> b which is the type signature of &
Examples
Example1 expression
>>> 5 & (+1) & show"6"
Example1 expression
>>> sqrt $ [1 / n^2 | n <- [1..1000]] & sum & (*6)3.1406380562059946
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
on b u x y runs the binary function bon the results of applying
unary function u to two arguments x and y. From the opposite
perspective, it transforms two inputs and combines the outputs.
\mathcal{O}(n). The genericLength function is an overloaded version
of length. In particular, instead of returning an Int, it returns any
type which is an instance of Num. It is, however, less efficient than
length.
Users should take care to pick a return type that is wide enough to contain
the full length of the list. If the width is insufficient, the overflow
behaviour will depend on the (+) implementation in the selected Num
instance. The following example overflows because the actual list length
of 200 lies outside of the Int8 range of -128..127.
The group function takes a list and returns a list of lists such
that the concatenation of the result is equal to the argument. Moreover,
each sublist in the result is non-empty, all elements are equal to the
first one, and consecutive equal elements of the input end up in the
same element of the output list.
group is a special case of groupBy, which allows the programmer to supply
their own equality test.
It's often preferable to use Data.List.NonEmpty.group,
which provides type-level guarantees of non-emptiness of inner lists.
A common idiom to squash repeating elements maphead.group
is better served by
mapData.List.NonEmpty.head.Data.List.NonEmpty.group
because it avoids partial functions.
Examples
Example1 expression
>>> group "Mississippi"["M","i","ss","i","ss","i","pp","i"]
The permutations function is maximally lazy:
for each n, the value of permutations xs starts with those permutations
that permute take n xs and keep drop n xs.
The sort function implements a stable sorting algorithm.
It is a special case of sortBy, which allows the programmer to supply
their own comparison function.
Elements are arranged from lowest to highest, keeping duplicates in
the order they appeared in the input.
The sortBy function is the non-overloaded version of sort.
The argument must be finite.
The supplied comparison relation is supposed to be reflexive and antisymmetric,
otherwise, e. g., for _ _ -> GT, the ordered list simply does not exist.
The relation is also expected to be transitive: if it is not then sortBy
might fail to find an ordered permutation, even if it exists.
Examples
Example1 expression
>>> sortBy (\(a,_) (b,_) -> compare a b) [(2, "world"), (4, "!"), (1, "Hello")][(1,"Hello"),(2,"world"),(4,"!")]
The unfoldr function is a `dual' to foldr: while foldr
reduces a list to a summary value, unfoldr builds a list from
a seed value. The function takes the element and returns Nothing
if it is done producing the list or returns Just(a,b), in which
case, a is a prepended to the list and b is used as the next
element in a recursive call. For example,
iterate f == unfoldr (\x -> Just (x, f x))
In some cases, unfoldr can undo a foldr operation:
unfoldr f' (foldr f z xs) == xs
if the following holds:
f' (f x y) = Just (x,y)
f' z = Nothing
Laziness
Example1 expression
>>> take 1 (unfoldr (\x -> Just (x, undefined)) 'a')"a"
Examples
Example1 expression
>>> unfoldr (\b -> if b == 0 then Nothing else Just (b, b-1)) 10[10,9,8,7,6,5,4,3,2,1]
Example1 expression
>>> take 10 $ unfoldr (\(x, y) -> Just (x, (y, x + y))) (0, 1)[0,1,1,2,3,5,8,13,21,54]
break, applied to a predicate p and a list xs, returns a tuple where
first element is longest prefix (possibly empty) of xs of elements that
do not satisfyp and second element is the remainder of the list:
breakp is equivalent to span (not . p)
and consequently to (takeWhile (not . p) xs, dropWhile (not . p) xs),
even if p is _|_.
iteratef x returns an infinite list of repeated applications
of f to x:
iterate f x == [x, f x, f (f x), ...]
Laziness
Note that iterate is lazy, potentially leading to thunk build-up if
the consumer doesn't force each element. See iterate' for a strict
variant of this function.
Example3 expressions
>>> let xs = iterate (\x -> if x == 0 then undefined else x - 1) 2>>> xs[2,1,0,*** Exception: Prelude.undefined>>> length (take 10 xs)10
In xs every element following 0 is bottom, but the list itself is
infinitely long because it is generated without forcing its elements.
Examples
Example1 expression
>>> take 10 $ iterate not True[True,False,True,False,True,False,True,False,True,False]
Example1 expression
>>> take 10 $ iterate (+3) 42[42,45,48,51,54,57,60,63,66,69]
replicaten x is a list of length n with x the value of
every element.
It is an instance of the more general genericReplicate,
in which n may be of any integral type.
\mathcal{O}(n). scanr is the right-to-left dual of scanl. Note that the order of parameters on the accumulating function are reversed compared to scanl.
Also note that
The print function outputs a value of any printable type to the standard
output device. Printable types are those that are instances of class Show;
print converts values to strings for output using the show operation and adds
a newline.
Case analysis for the Either type.
If the value is Left a, apply the first function to a;
if it is Right b, apply the second function to b.
Examples
We create two values of type EitherStringInt, one using the
Left constructor and another using the Right constructor. Then
we apply "either" the Prelude.length function (if we have a String)
or the "times-two" function (if we have an Int):
Example4 expressions
>>> let s = Left "foo" :: Either String Int>>> let n = Right 3 :: Either String Int>>> either length (*2) s3>>> either length (*2) n6
Assuming a Left value signifies some sort of error, we can use
isLeft to write a very simple error-reporting function that does
absolutely nothing in the case of success, and outputs "ERROR" if
any error occurred.
This example shows how isLeft might be used to avoid pattern
matching when one does not care about the value contained in the
constructor:
Example4 expressions
>>> import Control.Monad ( when )>>> let report e = when (isLeft e) $ putStrLn "ERROR">>> report (Right 1)>>> report (Left "parse error")ERROR
Assuming a Left value signifies some sort of error, we can use
isRight to write a very simple reporting function that only
outputs "SUCCESS" when a computation has succeeded.
This example shows how isRight might be used to avoid pattern
matching when one does not care about the value contained in the
constructor:
Example4 expressions
>>> import Control.Monad ( when )>>> let report e = when (isRight e) $ putStrLn "SUCCESS">>> report (Left "parse error")>>> report (Right 1)SUCCESS
Partitions a list of Either into two lists.
All the Left elements are extracted, in order, to the first
component of the output. Similarly the Right elements are extracted
to the second component of the output.
Examples
Basic usage:
Example2 expressions
>>> let list = [ Left "foo", Right 3, Left "bar", Right 7, Left "baz" ]>>> partitionEithers list(["foo","bar","baz"],[3,7])
The Either type represents values with two possibilities: a value of
type Either a b is either Left a or Right b.
The Either type is sometimes used to represent a value which is
either correct or an error; by convention, the Left constructor is
used to hold an error value and the Right constructor is used to
hold a correct value (mnemonic: "right" also means "correct").
Examples
The type EitherStringInt is the type of values which can be either
a String or an Int. The Left constructor can be used only on
Strings, and the Right constructor can be used only on Ints:
Example6 expressions
>>> let s = Left "foo" :: Either String Int>>> sLeft "foo">>> let n = Right 3 :: Either String Int>>> nRight 3>>> :type ss :: Either String Int>>> :type nn :: Either String Int
The fmap from our Functor instance will ignore Left values, but
will apply the supplied function to values contained in a Right:
Example4 expressions
>>> let s = Left "foo" :: Either String Int>>> let n = Right 3 :: Either String Int>>> fmap (*2) sLeft "foo">>> fmap (*2) nRight 6
The Monad instance for Either allows us to chain together multiple
actions which may fail, and fail overall if any of the individual
steps failed. First we'll write a function that can either parse an
Int from a Char, or fail.
Example3 expressions
>>> import Data.Char ( digitToInt, isDigit )>>> :{ let parseEither :: Char -> Either String Int parseEither c | isDigit c = Right (digitToInt c) | otherwise = Left "parse error">>> :}
The following should work, since both '1' and '2' can be
parsed as Ints.
Example2 expressions
>>> :{ let parseMultiple :: Either String Int parseMultiple = do x <- parseEither '1' y <- parseEither '2' return (x + y)>>> :}
Example1 expression
>>> parseMultipleRight 3
But the following should fail overall, since the first operation where
we attempt to parse 'm' as an Int will fail:
Example2 expressions
>>> :{ let parseMultiple :: Either String Int parseMultiple = do x <- parseEither 'm' y <- parseEither '2' return (x + y)>>> :}
A variant of <*> with the types of the arguments reversed. It differs from
flip(<*>) in that the effects are resolved in the order the arguments are
presented.
>>> some (putStr "la")lalalalalalalalala... * goes on forever *
Example1 expression
>>> some Nothingnothing
Example1 expression
>>> take 5 <$> some (Just 1)* hangs forever *
Note that this function can be used with Parsers based on
Applicatives. In that case some parser will attempt to
parse parser one or more times until it fails.
>>> many (putStr "la")lalalalalalalalala... * goes on forever *
Example1 expression
>>> many NothingJust []
Example1 expression
>>> take 5 <$> many (Just 1)* hangs forever *
Note that this function can be used with Parsers based on
Applicatives. In that case many parser will attempt to
parse parser zero or more times until it fails.
sequence computations and combine their results (<*> and liftA2).
A minimal complete definition must include implementations of pure
and one of either <*> or liftA2. If it defines both, then they must behave
the same as their default definitions:
Some functors support an implementation of liftA2 that is more
efficient than the default one. In particular, if fmap is an
expensive operation, it is likely better to use liftA2 than to
fmap over the structure and then use <*>.
This became a typeclass method in 4.10.0.0. Prior to that, it was
a function defined in terms of <*> and fmap.
Sequence actions, discarding the value of the first argument.
Examples
If used in conjunction with the Applicative instance for Maybe,
you can chain Maybe computations, with a possible "early return"
in case of Nothing.
Example1 expression
>>> Just 2 *> Just 3Just 3
Example1 expression
>>> Nothing *> Just 3Nothing
Of course a more interesting use case would be to have effectful
computations instead of just returning pure values.
Example4 expressions
>>> import Data.Char>>> import GHC.Internal.Text.ParserCombinators.ReadP>>> let p = string "my name is " *> munch1 isAlpha <* eof>>> readP_to_S p "my name is Simon"[("Simon","")]
Because we ignore the second type parameter to Const,
the Applicative instance, which has
(<*>) :: Monoid m => Const m (a -> b) -> Const m a -> Const m b
essentially turns into Monoid m => m -> m -> m, which is (<>)
When invoked inside mask, this function allows a masked
asynchronous exception to be raised, if one exists. It is
equivalent to performing an interruptible operation (see
#interruptible), but does not involve any actual blocking.
Sometimes you want to catch two different sorts of exception. You could
do something like
f = expr `catch` \ (ex :: ArithException) -> handleArith ex
`catch` \ (ex :: IOException) -> handleIO ex
However, there are a couple of problems with this approach. The first is
that having two exception handlers is inefficient. However, the more
serious issue is that the second exception handler will catch exceptions
in the first, e.g. in the example above, if handleArith throws an
IOException then the second exception handler will catch it.
Instead, we provide a function catches, which would be used thus:
f = expr `catches` [Handler (\ (ex :: ArithException) -> handleArith ex),
Handler (\ (ex :: IOException) -> handleIO ex)]
When you want to acquire a resource, do some work with it, and
then release the resource, it is a good idea to use bracket,
because bracket will install the necessary exception handler to
release the resource in the event that an exception is raised
during the computation. If an exception is raised, then bracket will
re-raise the exception (after performing the release).
The arguments to bracket are in this order so that we can partially apply
it, e.g.:
withFile name mode = bracket (openFile name mode) hClose
Bracket wraps the release action with mask, which is sufficient to ensure
that the release action executes to completion when it does not invoke any
interruptible actions, even in the presence of asynchronous exceptions. For
example, hClose is uninterruptible when it is not racing other uses of the
handle. Similarly, closing a socket (from "network" package) is also
uninterruptible under similar conditions. An example of an interruptible
action is killThread. Completion of interruptible release actions can be
ensured by wrapping them in uninterruptibleMask_, but this risks making
the program non-responsive to Control-C, or timeouts. Another option is to
run the release action asynchronously in its own thread:
void $ uninterruptibleMask_ $ forkIO $ do { ... }
The resource will be released as soon as possible, but the thread that invoked
bracket will not block in an uninterruptible state.
The function catchJust is like catch, but it takes an extra
argument which is an exception predicate, a function which
selects which type of exceptions we're interested in.
catchJust (\e -> if isDoesNotExistErrorType (ioeGetErrorType e) then Just () else Nothing)
(readFile f)
(\_ -> do hPutStrLn stderr ("No such file: " ++ show f)
return "")
Any other exceptions which are not matched by the predicate
are re-raised, and may be caught by an enclosing
catch, catchJust, etc.
Similar to catch, but returns an Either result which is
(Right a) if no exception of type e was raised, or (Left ex)
if an exception of type e was raised and its value is ex.
If any other type of exception is raised then it will be propagated
up to the next enclosing exception handler.
A variant of try that takes an exception predicate to select
which exceptions are caught (c.f. catchJust). If the exception
does not match the predicate, it is re-thrown.
This is the simplest of the exception-catching functions. It
takes a single argument, runs it, and if an exception is raised
the "handler" is executed, with the value of the exception passed as an
argument. Otherwise, the result is returned as normal. For example:
catch (readFile f)
(\e -> do let err = show (e :: IOException)
hPutStr stderr ("Warning: Couldn't open " ++ f ++ ": " ++ err)
return "")
Note that we have to give a type signature to e, or the program
will not typecheck as the type is ambiguous. While it is possible
to catch exceptions of any type, see the section "Catching all
exceptions" (in Control.Exception) for an explanation of the problems with doing so.
For catching exceptions in pure (non-IO) expressions, see the
function evaluate.
Note that due to Haskell's unspecified evaluation order, an
expression may throw one of several possible exceptions: consider
the expression (error "urk") + (1 `div` 0). Does
the expression throw
ErrorCall "urk", or DivideByZero?
The answer is "it might throw either"; the choice is
non-deterministic. If you are catching any type of exception then you
might catch either. If you are calling catch with type
IO Int -> (ArithException -> IO Int) -> IO Int then the handler may
get run with DivideByZero as an argument, or an ErrorCall "urk"
exception may be propagated further up. If you call it again, you
might get the opposite behaviour. This is ok, because catch is an
IO computation.
evaluate is typically used to uncover any exceptions that a lazy value
may contain, and possibly handle them.
evaluate only evaluates to weak head normal form. If deeper
evaluation is needed, the force function from Control.DeepSeq
may be handy:
evaluate $ force x
There is a subtle difference between evaluate x and return$! x,
analogous to the difference between throwIO and throw. If the lazy
value x throws an exception, return$! x will fail to return an
IO action and will throw an exception instead. evaluate x, on the
other hand, always produces an IO action; that action will throw an
exception upon execution iff x throws an exception upon evaluation.
The practical implication of this difference is that due to the
imprecise exceptions semantics,
(return $! error "foo") >> error "bar"
may throw either "foo" or "bar", depending on the optimizations
performed by the compiler. On the other hand,
evaluate (error "foo") >> error "bar"
is guaranteed to throw "foo".
The rule of thumb is to use evaluate to force or handle exceptions in
lazy values. If, on the other hand, you are forcing a lazy value for
efficiency reasons only and do not care about exceptions, you may
use return$! x.
Allow asynchronous exceptions to be raised even inside mask, making
the operation interruptible (see the discussion of "Interruptible operations"
in Control.Exception).
Executes an IO computation with asynchronous
exceptions masked. That is, any thread which attempts to raise
an exception in the current thread with throwTo
will be blocked until asynchronous exceptions are unmasked again.
The argument passed to mask is a function that takes as its
argument another function, which can be used to restore the
prevailing masking state within the context of the masked
computation. For example, a common way to use mask is to protect
the acquisition of a resource:
mask $ \restore -> do
x <- acquire
restore (do_something_with x) `onException` release
release
This code guarantees that acquire is paired with release, by masking
asynchronous exceptions for the critical parts. (Rather than write
this code yourself, it would be better to use
bracket which abstracts the general pattern).
Note that the restore action passed to the argument to mask
does not necessarily unmask asynchronous exceptions, it just
restores the masking state to that of the enclosing context. Thus
if asynchronous exceptions are already masked, mask cannot be used
to unmask exceptions again. This is so that if you call a library function
with exceptions masked, you can be sure that the library call will not be
able to unmask exceptions again. If you are writing library code and need
to use asynchronous exceptions, the only way is to create a new thread;
see forkIOWithUnmask.
Asynchronous exceptions may still be received while in the masked
state if the masked thread blocks in certain ways; see
Control.Exception#interruptible.
Threads created by forkIO inherit the
MaskingState from the parent; that is, to start a thread in the
MaskedInterruptible state,
use mask_ $ forkIO .... This is particularly useful if you need
to establish an exception handler in the forked thread before any
asynchronous exceptions are received. To create a new thread in
an unmasked state use forkIOWithUnmask.
Like mask, but the masked computation is not interruptible (see
Control.Exception#interruptible). THIS SHOULD BE USED WITH
GREAT CARE, because if a thread executing in uninterruptibleMask
blocks for any reason, then the thread (and possibly the program,
if this is the main thread) will be unresponsive and unkillable.
This function should only be necessary if you need to mask
exceptions around an interruptible operation, and you can guarantee
that the interruptible operation will only block for a short period
of time.
A class method without a definition (neither a default definition,
nor a definition in the appropriate instance) was called. The
String gives information about which method it was.
Thrown when the runtime system detects that the computation is
guaranteed not to terminate. Note that there is no guarantee that
the runtime system will notice whether any given computation is
guaranteed to terminate or not.
A record selector was applied to a constructor without the
appropriate field. This can only happen with a datatype with
multiple constructors, where some fields are in one constructor
but not another. The String gives information about the source
location of the record selector.
A record update was performed on a constructor without the
appropriate field. This can only happen with a datatype with
multiple constructors, where some fields are in one constructor
but not another. The String gives information about the source
location of the record update.
An expression that didn't typecheck during compile time was called.
This is only possible with -fdefer-type-errors. The String gives
details about the failed type check.
Deprecated. ErrorCallWithLocation has been deprecated in favour of ErrorCall (which does not have a location). Backtraces are now handled by the backtrace exception mechanisms exclusively.
Any type that you wish to throw or catch as an exception must be an
instance of the Exception class. The simplest case is a new exception
type directly below the root:
data MyException = ThisException | ThatException
deriving Show
instance Exception MyException
The default method definitions in the Exception class do what we need
in this case. You can now throw and catch ThisException and
ThatException as exceptions:
*Main> throw ThisException `catch` \e -> putStrLn ("Caught " ++ show (e :: MyException))
Caught ThisException
In more complicated examples, you may wish to define a whole hierarchy
of exceptions:
---------------------------------------------------------------------
-- Make the root exception type for all the exceptions in a compiler
data SomeCompilerException = forall e . Exception e => SomeCompilerException e
instance Show SomeCompilerException where
show (SomeCompilerException e) = show e
instance Exception SomeCompilerException
compilerExceptionToException :: Exception e => e -> SomeException
compilerExceptionToException = toException . SomeCompilerException
compilerExceptionFromException :: Exception e => SomeException -> Maybe e
compilerExceptionFromException x = do
SomeCompilerException a <- fromException x
cast a
---------------------------------------------------------------------
-- Make a subhierarchy for exceptions in the frontend of the compiler
data SomeFrontendException = forall e . Exception e => SomeFrontendException e
instance Show SomeFrontendException where
show (SomeFrontendException e) = show e
instance Exception SomeFrontendException where
toException = compilerExceptionToException
fromException = compilerExceptionFromException
frontendExceptionToException :: Exception e => e -> SomeException
frontendExceptionToException = toException . SomeFrontendException
frontendExceptionFromException :: Exception e => SomeException -> Maybe e
frontendExceptionFromException x = do
SomeFrontendException a <- fromException x
cast a
---------------------------------------------------------------------
-- Make an exception type for a particular frontend compiler exception
data MismatchedParentheses = MismatchedParentheses
deriving Show
instance Exception MismatchedParentheses where
toException = frontendExceptionToException
fromException = frontendExceptionFromException
We can now catch a MismatchedParentheses exception as
MismatchedParentheses, SomeFrontendException or
SomeCompilerException, but not other types, e.g. IOException:
*Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: MismatchedParentheses))
Caught MismatchedParentheses
*Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: SomeFrontendException))
Caught MismatchedParentheses
*Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException))
Caught MismatchedParentheses
*Main> throw MismatchedParentheses `catch` \e -> putStrLn ("Caught " ++ show (e :: IOException))
*** Exception: MismatchedParentheses
In most cases, the exception does not store its own ExceptionContext.
The default implementation of toException (which does not store any
ExceptionContext) is suitable for these cases.
In the rare case that the exception itself stores an ExceptionContext,
this context should be preserved by toException.
The SomeException type is the root of the exception type hierarchy.
When an exception of type e is thrown, behind the scenes it is
encapsulated in a SomeException.
The current thread's stack exceeded its limit.
Since an exception has been raised, the thread's stack
will certainly be below its limit again, but the
programmer should take remedial action
immediately.
The program's heap is reaching its limit, and
the program should take action to reduce the amount of
live data it has. Notes:
It is undefined which thread receives this exception.
GHC currently throws this to the same thread that
receives UserInterrupt, but this may change in the
future.
The GHC RTS currently can only recover from heap overflow
if it detects that an explicit memory limit (set via RTS flags).
has been exceeded. Currently, failure to allocate memory from
the operating system results in immediate termination of the
program.
This exception is raised by default in the main thread of
the program when the user requests to terminate the program
via the usual mechanism(s) (e.g. Control-C in the console).
Instances4Eq, Ord, Show, Exception
EqAsyncExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Exception
OrdAsyncExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Exception
ShowAsyncExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Exception
Exceptions that occur in the IO monad.
An IOException records a more specific error type, a descriptive
string and maybe the handle that was used when the error was
flagged.
Instances4Eq, Show, Exception, MonadError
EqIOExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Exception
ShowIOExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Exception
The Eq class defines equality (==) and inequality (/=).
All the basic datatypes exported by the Prelude are instances of Eq,
and Eq may be derived for any datatype whose constituents are also
instances of Eq.
The Haskell Report defines no laws for Eq. However, instances are
encouraged to follow these properties:
The Ord class is used for totally ordered datatypes.
Instances of Ord can be derived for any user-defined datatype whose
constituent types are in Ord. The declared order of the constructors in
the data declaration determines the ordering in derived Ord instances. The
Ordering datatype allows a single comparison to determine the precise
ordering of two objects.
Ord, as defined by the Haskell report, implements a total order and has the
following properties:
Note that (7.) and (8.) do not require min and max to return either of
their arguments. The result is merely required to equal one of the
arguments in terms of (==). Users who expect a stronger guarantee are advised
to write their own min and/or max functions.
The nuance of the above distinction is not always fully internalized by
developers, and in the past (tracing back to the Haskell 1.4 Report) the
specification for Ord asserted the stronger property that (min x y, max x
y) = (x, y) or (y, x), or in other words, that min and maxwill
return one of their arguments, using argument order as the tie-breaker if
the arguments are equal by comparison. A few list and
Foldable functions have behavior that is best understood
with this assumption in mind: all variations of minimumBy and maximumBy
(which can't use min and max in their implementations) are written such
that minimumBy compare and maximumBy compare are respectively
equivalent to minimum and maximum (which do use min and max) only if
min and max adhere to this tie-breaking convention. Otherwise, if there
are multiple least or largest elements in a container, minimum and
maximum may not return the same one that minimumBy compare and
maximumBy compare do (though they should return something that is
equal). (This is relevant for types with non-extensional equality, like
Arg, but also in cases where the precise reference held
matters for memory-management reasons.) Unless there is a reason to deviate,
it is less confusing for implementors of Ord to respect this same
convention (as the default definitions of min and max do).
Minimal complete definition: either compare or <=.
Using compare can be more efficient for complex types.
OrdByteArrayDefined in base-4.23.0.0 · Data.Array.Byte
Non-lexicographic ordering. This compares the lengths of
the byte arrays first and uses a lexicographic ordering if
the lengths are equal. Subject to change between major versions.
OrdByteStringDefined in bytestring-0.12.2.0 · Data.ByteString.Internal.Type
OrdByteStringDefined in bytestring-0.12.2.0 · Data.ByteString.Lazy.Internal
OrdShortByteStringDefined in bytestring-0.12.2.0 · Data.ByteString.Short.Internal
Lexicographic order.
OrdIntSetDefined in containers-0.8 · Data.IntSet.Internal
OrdIntersectionDefined in containers-0.8 · Data.IntSet.Internal
OrdVoidDefined in ghc-internal-10.0.0 · GHC.Internal.Base
OrdBigNatDefined in ghc-internal-10.0.0 · GHC.Internal.Bignum.BigNat
OrdIntegerDefined in ghc-internal-10.0.0 · GHC.Internal.Bignum.Integer
OrdNaturalDefined in ghc-internal-10.0.0 · GHC.Internal.Bignum.Natural
OrdByteOrderDefined in ghc-internal-10.0.0 · GHC.Internal.ByteOrder
OrdClosureTypeDefined in ghc-internal-10.0.0 · GHC.Internal.ClosureTypes
OrdBlockReasonDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
OrdThreadIdDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
OrdThreadStatusDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
OrdAllDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Semigroup.Internal
OrdAnyDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Semigroup.Internal
OrdSomeTypeRepDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Typeable.Internal
OrdUniqueDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Unique
OrdVersionDefined in ghc-internal-10.0.0 · GHC.Internal.Data.Version
OrdTimeoutKeyDefined in ghc-internal-10.0.0 · GHC.Internal.Event.TimeOut
OrdUniqueDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Unique
OrdErrorCallDefined in ghc-internal-10.0.0 · GHC.Internal.Exception
OrdArithExceptionDefined in ghc-internal-10.0.0 · GHC.Internal.Exception.Type
OrdFingerprintDefined in ghc-internal-10.0.0 · GHC.Internal.Fingerprint.Type
OrdCBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCClockDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCLLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCPtrdiffDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCSCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCSUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCSigAtomicDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCSizeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCTimeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCULLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCULongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCUShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdCWcharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
OrdIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
OrdWordPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
OrdAssociativityDefined in ghc-internal-10.0.0 · GHC.Internal.Generics
OrdSpecificityDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdStmtDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdTyLitDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdTySynEqnDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdTypeDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdTypeFamilyHeadDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Syntax
OrdSomeCharDefined in ghc-internal-10.0.0 · GHC.Internal.TypeLits
OrdSomeSymbolDefined in ghc-internal-10.0.0 · GHC.Internal.TypeLits
OrdSomeNatDefined in ghc-internal-10.0.0 · GHC.Internal.TypeNats
OrdBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
OrdCharDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
OrdDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
IEEE 754 Double-precision type includes not only numbers, but also
positive and negative infinities and a special element called NaN
(which can be quiet or signal).
IEEE 754-2008, section 5.11 requires that if at least one of arguments of
<=, <, >, >= is NaN then the result of the comparison is False,
and instanceOrdDouble complies with this requirement. This violates
the reflexivity: both NaN<=NaN and NaN>=NaN are False.
IEEE 754-2008, section 5.10 defines totalOrder predicate. Unfortunately,
compare on Doubles violates the IEEE standard and does not define a total order.
More specifically, both compareNaNx and comparexNaN always return GT.
Thus, users must be extremely cautious when using instanceOrdDouble.
For instance, one should avoid ordered containers with keys represented by Double,
because data loss and corruption may happen. An IEEE-compliant compare is available
in fp-ieee package as TotallyOrdered newtype.
Moving further, the behaviour of min and max with regards to NaN is
also non-compliant. IEEE 754-2008, section 5.3.1 defines that quiet NaN
should be treated as a missing data by minNum and maxNum functions,
for example, minNum(NaN, 1) = minNum(1, NaN) = 1. Some languages such as Java
deviate from the standard implementing minNum(NaN, 1) = minNum(1, NaN) = NaN.
However, min / max in base are even worse: minNaN 1 is 1, but min 1 NaN
is NaN.
IEEE 754-2008 compliant min / max can be found in ieee754 package under
minNum / maxNum names. Implementations compliant with
minimumNumber / maximumNumber from a newer
IEEE 754-2019,
section 9.6 are available from fp-ieee package.
OrdFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
See instanceOrdDouble for discussion of deviations from IEEE 754 standard.
OrdIntDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
OrdOrderingDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
OrdTyConDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
OrdWordDefined in ghc-internal-10.0.0 · GHC.Internal.Classes
Ord (Proxys)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Proxy
Ord (TypeRepa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Typeable.Internal
Ord (U1p)Defined in ghc-internal-10.0.0 · GHC.Internal.Generics
Ord (V1p)Defined in ghc-internal-10.0.0 · GHC.Internal.Generics
Orda => Ord (Argab)Defined in base-4.23.0.0 · Data.Semigroup
Note that Arg's Ord instance has min and max implementations that
differ from the tie-breaking conventions of the default implementation of
min and max in class Ord; Arg breaks ties by favoring the first
argument in both functions.
(Ord1f, Orda) => Ord (Liftfa)Defined in transformers-0.6.3.0 · Control.Applicative.Lift
(Ord1m, Orda) => Ord (MaybeTma)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Maybe
(Orda, Ordb) => Ord (Eitherab)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Either
(Orda, Ordb) => Ord (a, b)Defined in ghc-internal-10.0.0 · GHC.Internal.Classes
(Ordk, Ordv) => Ord (Mapkv)Defined in containers-0.8 · Data.Map.Internal
(Ordk, Ordv) => Ord (HashMapkv)Defined in unordered-containers-0.2.21 · Data.HashMap.Internal
The ordering is total and consistent with the Eq instance. However,
nothing else about the ordering is specified, and it may change from
version to version of either this package or of hashable.
(Ixi, Orde) => Ord (Arrayie)Defined in ghc-internal-10.0.0 · GHC.Internal.Arr
The Down type allows you to reverse sort order conveniently. A value of type
Down a contains a value of type a (represented as Down a).
If a has an Ord instance associated with it then comparing two
values thus wrapped will give you the opposite of their normal sort order.
This is particularly useful when sorting in generalised list comprehensions,
as in: then sortWith by Down x.
Example1 expression
>>> compare True FalseGT
Example1 expression
>>> compare (Down True) (Down False)LT
If a has a Bounded instance then the wrapped instance also respects
the reversed ordering by exchanging the values of minBound and
maxBound.
Example1 expression
>>> minBound :: Int-9223372036854775808
Example1 expression
>>> minBound :: Down IntDown 9223372036854775807
All other instances of Down a behave as they do for a.
This function may be used as a value for fmap in a Functor
instance, provided that traverse is defined. (Using
fmapDefault with a Traversable instance defined only by
sequenceA will result in infinite recursion.)
The mapAccumL function behaves like a combination of fmap
and foldl; it applies a function to each element of a structure,
passing an accumulating parameter from left to right, and returning
a final value of this accumulator together with the new structure.
Examples
Basic usage:
Example1 expression
>>> mapAccumL (\a b -> (a + b, a)) 0 [1..10](55,[0,1,3,6,10,15,21,28,36,45])
Example1 expression
>>> mapAccumL (\a b -> (a <> show b, a)) "0" [1..5]("012345",["0","01","012","0123","01234"])
The mapAccumM function behaves like a combination of mapM and
mapAccumL that traverses the structure while evaluating the actions
and passing an accumulating parameter from left to right.
It returns a final value of this accumulator together with the new structure.
The accumulator is often used for caching the intermediate results of a computation.
Examples
Basic usage:
Example2 expressions
>>> let expensiveDouble a = putStrLn ("Doubling " <> show a) >> pure (2 * a)>>> :{mapAccumM (\cache a -> case lookup a cache of Nothing -> expensiveDouble a >>= \double -> pure ((a, double):cache, double) Just double -> pure (cache, double) ) [] [1, 2, 3, 1, 2, 3]:}Doubling 1Doubling 2Doubling 3([(3,6),(2,4),(1,2)],[2,4,6,2,4,6])
The mapAccumR function behaves like a combination of fmap
and foldr; it applies a function to each element of a structure,
passing an accumulating parameter from right to left, and returning
a final value of this accumulator together with the new structure.
Examples
Basic usage:
Example1 expression
>>> mapAccumR (\a b -> (a + b, a)) 0 [1..10](55,[54,52,49,45,40,34,27,19,10,0])
Example1 expression
>>> mapAccumR (\a b -> (a <> show b, a)) "0" [1..5]("054321",["05432","0543","054","05","0"])
Functors representing data structures that can be transformed to
structures of the same shape by performing an Applicative (or,
therefore, Monad) action on each element from left to right.
A more detailed description of what same shape means, the various methods,
how traversals are constructed, and example advanced use-cases can be found
in the Overview section of Data.Traversable#overview.
For the class laws see the Laws section of Data.Traversable#laws.
Map each element of a structure to an action, evaluate these actions
from left to right, and collect the results. For a version that ignores
the results see traverse_.
Examples
Basic usage:
In the first two examples we show each evaluated action mapping to the
output structure.
Example1 expression
>>> traverse Just [1,2,3,4]Just [1,2,3,4]
Example1 expression
>>> traverse id [Right 1, Right 2, Right 3, Right 4]Right [1,2,3,4]
In the next examples, we show that Nothing and Left values short
circuit the created structure.
Example1 expression
>>> traverse (const Nothing) [1,2,3,4]Nothing
Example1 expression
>>> traverse (\x -> if odd x then Just x else Nothing) [1,2,3,4]Nothing
Example1 expression
>>> traverse id [Right 1, Right 2, Right 3, Right 4, Left 0]Left 0
Evaluate each action in the structure from left to right, and
collect the results. For a version that ignores the results
see sequenceA_.
Examples
Basic usage:
For the first two examples we show sequenceA fully evaluating a
a structure and collecting the results.
Example1 expression
>>> sequenceA [Just 1, Just 2, Just 3]Just [1,2,3]
Example1 expression
>>> sequenceA [Right 1, Right 2, Right 3]Right [1,2,3]
The next two example show Nothing and Just will short circuit
the resulting structure if present in the input. For more context,
check the Traversable instances for Either and Maybe.
Example1 expression
>>> sequenceA [Just 1, Just 2, Just 3, Nothing]Nothing
Example1 expression
>>> sequenceA [Right 1, Right 2, Right 3, Left 4]Left 4
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.
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]
and returns the conjunction of a container of Bools. For the
result to be True, the container must be finite; False, however,
results from a False value finitely far from the left end.
Examples
Basic usage:
Example1 expression
>>> and []True
Example1 expression
>>> and [True]True
Example1 expression
>>> and [False]False
Example1 expression
>>> and [True, True, False]False
Example1 expression
>>> and (False : repeat True) -- Infinite list [False,True,True,True,...False
The find function takes a predicate and a structure and returns
the leftmost element of the structure matching the predicate, or
Nothing if there is no such element.
Left-to-right monadic fold over the elements of a structure.
Given a structure t with elements (a, b, ..., w, x, y), the result of
a fold with an operator function f is equivalent to:
foldlM f z t = do
aa <- f z a
bb <- f aa b
...
xx <- f ww x
yy <- f xx y
return yy -- Just @return z@ when the structure is empty
For a Monad m, given two functions f1 :: a -> m b and f2 :: b -> m c,
their Kleisli composition (f1 >=> f2) :: a -> m c is defined by:
(f1 >=> f2) a = f1 a >>= f2
Another way of thinking about foldlM is that it amounts to an application
to z of a Kleisli composition:
foldlM f z t =
flip f a >=> flip f b >=> ... >=> flip f x >=> flip f y $ z
The monadic effects of foldlM are sequenced from left to right.
If at some step the bind operator (>>=) short-circuits (as with, e.g.,
mzero in a MonadPlus), the evaluated effects will be from an initial
segment of the element sequence. If you want to evaluate the monadic
effects in right-to-left order, or perhaps be able to short-circuit after
processing a tail of the sequence of elements, you'll need to use foldrM
instead.
If the monadic effects don't short-circuit, the outermost application of
f is to the rightmost element y, so that, ignoring effects, the result
looks like a left fold:
((((z `f` a) `f` b) ... `f` w) `f` x) `f` y
Examples
Basic usage:
Example2 expressions
>>> let f a e = do { print e ; return $ e : a }>>> foldlM f [] [0..3]0123[3,2,1,0]
Right-to-left monadic fold over the elements of a structure.
Given a structure t with elements (a, b, c, ..., x, y), the result of
a fold with an operator function f is equivalent to:
foldrM f z t = do
yy <- f y z
xx <- f x yy
...
bb <- f b cc
aa <- f a bb
return aa -- Just @return z@ when the structure is empty
For a Monad m, given two functions f1 :: a -> m b and f2 :: b -> m c,
their Kleisli composition (f1 >=> f2) :: a -> m c is defined by:
(f1 >=> f2) a = f1 a >>= f2
Another way of thinking about foldrM is that it amounts to an application
to z of a Kleisli composition:
foldrM f z t = f y >=> f x >=> ... >=> f b >=> f a $ z
The monadic effects of foldrM are sequenced from right to left, and e.g.
folds of infinite lists will diverge.
If at some step the bind operator (>>=) short-circuits (as with, e.g.,
mzero in a MonadPlus), the evaluated effects will be from a tail of the
element sequence. If you want to evaluate the monadic effects in
left-to-right order, or perhaps be able to short-circuit after an initial
sequence of elements, you'll need to use foldlM instead.
If the monadic effects don't short-circuit, the outermost application of
f is to the leftmost element a, so that, ignoring effects, the result
looks like a right fold:
a `f` (b `f` (c `f` (... (x `f` (y `f` z))))).
Examples
Basic usage:
Example2 expressions
>>> let f i acc = do { print i ; return $ i : acc }>>> foldrM f [] [0..3]3210[0,1,2,3]
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.
The largest element of a non-empty structure with respect to the
given comparison function. Structure order is used as a tie-breaker: if
there are multiple largest elements, the rightmost of them is chosen.
The least element of a non-empty structure with respect to the
given comparison function. Structure order is used as a tie-breaker: if
there are multiple least elements, the leftmost of them is chosen.
or returns the disjunction of a container of Bools. For the
result to be False, the container must be finite; True, however,
results from a True value finitely far from the left end.
Examples
Basic usage:
Example1 expression
>>> or []False
Example1 expression
>>> or [True]True
Example1 expression
>>> or [False]False
Example1 expression
>>> or [True, True, False]True
Example1 expression
>>> or (True : repeat False) -- Infinite list [True,False,False,False,...True
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.
Map each element of a structure to an Applicative action, evaluate these
actions from left to right, and ignore the results. For a version that
doesn't ignore the results see traverse.
The Foldable class represents data structures that can be reduced to a
summary value one element at a time. Strict left-associative folds are a
good fit for space-efficient reduction, while lazy right-associative folds
are a good fit for corecursive iteration, or for folds that short-circuit
after processing an initial subsequence of the structure's elements.
Instances can be derived automatically by enabling the DeriveFoldable
extension. For example, a derived instance for a binary tree might be:
{-# LANGUAGE DeriveFoldable #-}
data Tree a = Empty
| Leaf a
| Node (Tree a) a (Tree a)
deriving Foldable
A more detailed description can be found in the Overview section of
Data.Foldable#overview.
For the class laws see the Laws section of Data.Foldable#laws.
Given a structure with elements whose type is a Monoid, combine them
via the monoid's (<>) operator. This fold is right-associative and
lazy in the accumulator. When you need a strict left-associative fold,
use foldMap' instead, with id as the map.
Map each element of the structure into a monoid, and combine the
results with (<>). This fold is right-associative and lazy in the
accumulator. For strict left-associative folds consider foldMap'
instead.
When a Monoid's (<>) is lazy in its second argument, foldMap can
return a result even from an unbounded structure. For example, lazy
accumulation enables Data.ByteString.Builder to efficiently serialise
large data structures and produce the output incrementally:
Example5 expressions
>>> import qualified Data.ByteString.Lazy as L>>> import qualified Data.ByteString.Builder as B>>> let bld :: Int -> B.Builder; bld i = B.intDec i <> B.word8 0x20>>> let lbs = B.toLazyByteString $ foldMap bld [0..]>>> L.take 64 lbs"0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"
Right-associative fold of a structure, lazy in the accumulator.
In the case of lists, foldr, when applied to a binary operator, a
starting value (typically the right-identity of the operator), and a
list, reduces the list using the binary operator, from right to left:
foldr f z [x1, x2, ..., xn] == x1 `f` (x2 `f` ... (xn `f` z)...)
Note that since the head of the resulting expression is produced by an
application of the operator to the first element of the list, given an
operator lazy in its right argument, foldr can produce a terminating
expression from an unbounded list.
For a general Foldable structure this should be semantically identical
to,
Applying foldr to infinite structures terminates when the operator is
lazy in its second argument (the initial accumulator is never used in
this case, and so could be left undefined, but [] is more clear):
Example1 expression
>>> take 5 $ foldr (\i acc -> i : fmap (+3) acc) [] (repeat 1)[1,4,7,10,13]
foldr' is a variant of foldr that performs strict reduction from
right to left, i.e. starting with the right-most element. The input
structure must be finite, otherwise foldr' runs out of space
(diverges).
If you want a strict right fold in constant space, you need a structure
that supports faster than O(n) access to the right-most element, such
as Seq from the containers package.
This method does not run in constant space for structures such as lists
that don't support efficient right-to-left iteration and so require
O(n) space to perform right-to-left reduction. Use of this method
with such a structure is a hint that the chosen structure may be a poor
fit for the task at hand. If the order in which the elements are
combined is not important, use foldl' instead.
Left-associative fold of a structure, lazy in the accumulator. This
is rarely what you want, but can work well for structures with efficient
right-to-left sequencing and an operator that is lazy in its left
argument.
In the case of lists, foldl, when applied to a binary operator, a
starting value (typically the left-identity of the operator), and a
list, reduces the list using the binary operator, from left to right:
foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn
Note that to produce the outermost application of the operator the
entire input list must be traversed. Like all left-associative folds,
foldl will diverge if given an infinite list.
If you want an efficient strict left-fold, you probably want to use
foldl' instead of foldl. The reason for this is that the latter
does not force the inner results (e.g. z `f` x1 in the above
example) before applying them to the operator (e.g. to (`f` x2)).
This results in a thunk chain O(n) elements long, which then must be
evaluated from the outside-in.
For a general Foldable structure this should be semantically identical
to:
The first example is a strict fold, which in practice is best performed
with foldl'.
Example1 expression
>>> foldl (+) 42 [1,2,3,4]52
Though the result below is lazy, the input is reversed before prepending
it to the initial accumulator, so corecursion begins only after traversing
the entire input string.
Example1 expression
>>> foldl (\acc c -> c : acc) "abcd" "efgh""hgfeabcd"
A left fold of a structure that is infinite on the right cannot
terminate, even when for any finite input the fold just returns the
initial accumulator:
Left-associative fold of a structure but with strict application of
the operator.
This ensures that each step of the fold is forced to Weak Head Normal
Form before being applied, avoiding the collection of thunks that would
otherwise occur. This is often what you want to strictly reduce a
finite structure to a single strict result (e.g. sum).
For a general Foldable structure this should be semantically identical
to,
List of elements of a structure, from left to right. If the entire
list is intended to be reduced via a fold, just fold the structure
directly bypassing the list.
Test whether the structure is empty. The default implementation is
Left-associative and lazy in both the initial element and the
accumulator. Thus optimised for structures where the first element can
be accessed in constant time. Structures where this is not the case
should have a non-default implementation.
Examples
Basic usage:
Example1 expression
>>> null []True
Example1 expression
>>> null [1]False
null is expected to terminate even for infinite structures.
The default implementation terminates provided the structure
is bounded on the left (there is a leftmost element).
Returns the size/length of a finite structure as an Int. The
default implementation just counts elements starting with the leftmost.
Instances for structures that can compute the element count faster
than via element-by-element counting, should provide a specialised
implementation.
For infinite structures, the default implementation of elem
terminates if the sought-after value exists at a finite distance
from the left side of the structure:
The largest element of a non-empty structure. This function is
equivalent to foldr1max, and its behavior on structures with
multiple largest elements depends on the relevant implementation of
max. For the default implementation of max (max x y = if x <= y
then y else x), structure order is used as a tie-breaker: if there are
multiple largest elements, the rightmost of them is chosen (this is
equivalent to maximumBycompare).
This function is non-total and will raise a runtime exception if the
structure happens to be empty. A structure that supports random access
and maintains its elements in order should provide a specialised
implementation to return the maximum in faster than linear time.
Examples
Basic usage:
Example1 expression
>>> maximum [1..10]10
Example1 expression
>>> maximum []*** Exception: Prelude.maximum: empty list
Example1 expression
>>> maximum Nothing*** Exception: maximum: empty structure
WARNING: This function is partial for possibly-empty structures like lists.
The least element of a non-empty structure. This function is
equivalent to foldr1min, and its behavior on structures with
multiple largest elements depends on the relevant implementation of
min. For the default implementation of min (min x y = if x <= y
then x else y), structure order is used as a tie-breaker: if there are
multiple least elements, the leftmost of them is chosen (this is
equivalent to minimumBycompare).
This function is non-total and will raise a runtime exception if the
structure happens to be empty. A structure that supports random access
and maintains its elements in order should provide a specialised
implementation to return the minimum in faster than linear time.
Examples
Basic usage:
Example1 expression
>>> minimum [1..10]1
Example1 expression
>>> minimum []*** Exception: Prelude.minimum: empty list
mtimesDefault n a = a <> a <> ... <> a -- using <> (n-1) times
In many cases, stimes 0 a for a Monoid will produce mempty.
However, there are situations when it cannot do so. In particular,
the following situation is fairly common:
data T a = ...
class Constraint1 a
class Constraint1 a => Constraint2 a
instance Constraint1 a => Semigroup (T a)
instance Constraint2 a => Monoid (T a)
Since Constraint1 is insufficient to implement mempty,
stimes for T a cannot do so.
When working with such a type, or when working polymorphically with
Semigroup instances, mtimesDefault should be used when the
multiplier might be zero. It is implemented using stimes when
the multiplier is nonzero and mempty when it is zero.
NOTE: This is not needed anymore since Semigroup became a superclass of
Monoid in base-4.11 and this newtype be deprecated at some point in the future.
The default definition will raise an exception for a multiplier that is <= 0.
This may be overridden with an implementation that is total. For monoids
it is preferred to use stimesMonoid.
By making this a member of the class, idempotent semigroups
and monoids can upgrade this to execute in \mathcal{O}(1) by
picking stimes = stimesIdempotent or stimes =
stimesIdempotentMonoid respectively.
Concatenation of StrictBuilder is right-biased:
the right builder will be run first. This allows a builder to
run tail-recursively when it was accumulated left-to-right.
Semigroup ()Defined in ghc-internal-10.0.0 · GHC.Internal.Base
The method names refer to the monoid of lists under concatenation,
but there are many other instances.
Some types can be viewed as a monoid in more than one way,
e.g. both addition and multiplication on numbers.
In such cases we often define newtypes and make those instances
of Monoid, e.g. Data.Semigroup.Sum and Data.Semigroup.Product.
NOTE: Semigroup is a superclass of Monoid since base-4.11.0.0.
NOTE: This method is redundant and has the default
implementation mappend = (<>) since base-4.11.0.0.
Should it be implemented manually, since mappend is a synonym for
(<>), it is expected that the two functions are defined the same
way. In a future GHC release mappend will be removed from Monoid.
For most types, the default definition for mconcat will be
used, but the function is included in the class definition so
that an optimized version can be provided for specific types.
Lift a semigroup into Maybe forming a Monoid according to
http://en.wikipedia.org/wiki/Monoid: "Any semigroup S may be
turned into a monoid simply by adjoining an element e not in S
and defining e*e = e and e*s = s = s*e for all s ∈ S."
Since 4.11.0: constraint on inner a value generalised from
Monoid to Semigroup.
Bitsa => Monoid (Iora)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Bits
Bitsa => Monoid (Xora)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Bits
FiniteBitsa => Monoid (Anda)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Bits
This constraint is arguably too strong. However,
as some types (such as Natural) have undefined complement, this is the
only safe choice.
FiniteBitsa => Monoid (Iffa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Bits
This constraint is arguably
too strong. However, as some types (such as Natural) have undefined
complement, this is the only safe choice.
Orda => Monoid (Seta)Defined in containers-0.8 · Data.Set.Internal
Enum (fa) => Enum (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Eq (fa) => Eq (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
(Data (fa), Dataa, Typeablef) => Data (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Data
(Applicativef, Numa) => Num (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Note that even if the underlying Num and Applicative instances are
lawful, for most Applicatives, this instance will not be lawful. If you use
this instance with the list Applicative, the following customary laws will
not hold:
Commutativity:
Example2 expressions
>>> Ap [10,20] + Ap [1,2]Ap {getAp = [11,12,21,22]}>>> Ap [1,2] + Ap [10,20]Ap {getAp = [11,21,12,22]}
Additive inverse:
Example2 expressions
>>> Ap [] + negate (Ap [])Ap {getAp = []}>>> fromInteger 0 :: Ap [] IntAp {getAp = [0]}
Distributivity:
Example2 expressions
>>> Ap [1,2] * (3 + 4)Ap {getAp = [7,14]}>>> (Ap [1,2] * 3) + (Ap [1,2] * 4)Ap {getAp = [7,11,10,14]}
Ord (fa) => Ord (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Read (fa) => Read (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Show (fa) => Show (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
Generic (Apfa)Defined in ghc-internal-10.0.0 · GHC.Internal.Generics
Maybe monoid returning the leftmost non-Nothing value.
First a is isomorphic to AltMaybe a, but precedes it
historically.
Beware that Data.Monoid.First is different from
Data.Semigroup.First. The former returns the first non-Nothing,
so Data.Monoid.First Nothing <> x = x. The latter simply returns the first value,
thus Data.Semigroup.First Nothing <> x = Data.Semigroup.First Nothing.
Examples
Example1 expression
>>> First (Just "hello") <> First Nothing <> First (Just "world")First {getFirst = Just "hello"}
Example1 expression
>>> First Nothing <> memptyFirst {getFirst = Nothing}
Data.Semigroup.Last. The former returns the last non-Nothing,
so x <> Data.Monoid.Last Nothing = x. The latter simply returns the last value,
thus x <> Data.Semigroup.Last Nothing = Data.Semigroup.Last Nothing.
Examples
Example1 expression
>>> Last (Just "hello") <> Last Nothing <> Last (Just "world")Last {getLast = Just "world"}
Example1 expression
>>> Last Nothing <> memptyLast {getLast = Nothing}
A bifunctor is a type constructor that takes
two type arguments and is a functor in both arguments. That
is, unlike with Functor, a type constructor such as Either
does not need to be partially applied for a Bifunctor
instance, and the methods in this class permit mapping
functions over the Left value or the Right value,
or both at the same time.
Formally, the class Bifunctor represents a bifunctor
from Hask -> Hask.
Intuitively it is a bifunctor where both the first and second
arguments are covariant.
The class definition of a Bifunctorp uses the
QuantifiedConstraints
language extension to quantify over the first type
argument a in its context. The context requires that p a
must be a Functor for all a. In other words a partially
applied Bifunctor must be a Functor. This makes Functor a
superclass of Bifunctor such that a function with a
Bifunctor constraint may use fmap in its implementation.
Functor has been a quantified superclass of
Bifunctor since base-4.18.0.0.
Hashable is intended exclusively for use in in-memory data structures.
.
Hashable does not have a fixed standard.
This allows it to improve over time.
.
Because it does not have a fixed standard, different computers or computers on different versions of the code will observe different hash values.
As such, Hashable is not recommended for use other than in-memory datastructures.
Specifically, Hashable is not intended for network use or in applications which persist hashed values.
For stable hashing use named hashes: sha256, crc32, xxhash etc.
If two values are equal according to the == method, then
applying the hashWithSalt method on each of the two values
must produce the same integer result if the same salt is
used in each case.
It is not required that if two values are unequal
according to the == method, then applying the
hashWithSalt method on each of the two values must produce
distinct integer results. However, the programmer should be
aware that producing distinct integer results for unequal
values may improve the performance of hashing-based data
structures.
This method can be used to compute different hash values for
the same input by providing a different salt in each
application of the method. This implies that any instance
that defines hashWithSaltmust make use of the salt in
its implementation.
Like hashWithSalt, but no salt is used. The default
implementation uses hashWithSalt with some default salt.
Instances might want to implement this method to provide a more
efficient implementation than the default implementation.
The deep analogue of $!. f $!! x fully evaluates x
before returning f x.
There is no guarantee about the ordering of evaluation.
f x may be evaluated before x is fully evaluated.
To impose an actual order on evaluation, use pseq from
Control.Parallel in the parallel package.
deepseq: fully evaluates the first argument, before returning the
second.
The name deepseq is used to illustrate the relationship to seq:
where seq is shallow in the sense that it only evaluates the top
level of its argument, deepseq traverses the entire data structure
evaluating it completely.
deepseq can be useful for forcing pending exceptions,
eradicating space leaks, or forcing lazy I/O to happen. It is
also useful in conjunction with parallel Strategies (see the
parallel package).
There is no guarantee about the ordering of evaluation. The
implementation may evaluate the components of the structure in
any order or in parallel. To impose an actual order on
evaluation, use pseq from Control.Parallel in the
parallel package.
A variant of deepseq that is useful in some circumstances:
force x = x `deepseq` x
force x fully evaluates x, and then returns it. Note that
force x only performs evaluation when the value of force x
itself is demanded, so essentially it turns shallow evaluation into
deep evaluation.
force can be conveniently used in combination with ViewPatterns:
{-# LANGUAGE BangPatterns, ViewPatterns #-}
import Control.DeepSeq
someFun :: ComplexData -> SomeResult
someFun (force -> !arg) = {- 'arg' will be fully evaluated -}
Another useful application is to combine force with
evaluate in order to force deep evaluation
relative to other IO operations:
import Control.Exception (evaluate)
import Control.DeepSeq
main = do
result <- evaluate $ force $ pureComputation
{- 'result' will be fully evaluated at this point -}
return ()
Finally, here's an exception safe variant of the readFile' example:
Starting with GHC 7.2, you can automatically derive instances
for types possessing a Generic instance.
Note: Generic1 can be auto-derived starting with GHC 7.4
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic, Generic1)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1)
instance NFData a => NFData (Foo a)
instance NFData1 Foo
data Colour = Red | Green | Blue
deriving Generic
instance NFData Colour
Starting with GHC 7.10, the example above can be written more
concisely by enabling the new DeriveAnyClass extension:
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import GHC.Generics (Generic)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1, NFData, NFData1)
data Colour = Red | Green | Blue
deriving (Generic, NFData)
Compatibility with previous deepseq versions
Prior to version 1.4.0.0, the default implementation of the rnf
method was defined as
However, starting with deepseq-1.4.0.0, the default
implementation is based on DefaultSignatures allowing for
more accurate auto-derived NFData instances. If you need the
previously used exact default rnf method implementation
semantics, use
instance NFData Colour where rnf x = seq x ()
or alternatively
instance NFData Colour where rnf = rwhnf
or
{-# LANGUAGE BangPatterns #-}
instance NFData Colour where rnf !_ = ()
Proxy is a type that holds no data, but has a phantom parameter of
arbitrary type (or even kind). Its use is to provide type information, even
though there is no value available of that type (or it may be too costly to
create one).
Historically, Proxy :: Proxy a is a safer alternative to the
undefined :: a idiom.
Representational equality. If Coercion a b is inhabited by some terminating
value, then the type a has the same underlying representation as the type b.
To use this equality in practice, pattern-match on the Coercion a b to get out
the Coercible a b instance, and then use coerce to apply it.
Propositional equality. If a :~: b is inhabited by some terminating
value, then the type a is the same as the type b. To use this equality
in practice, pattern-match on the a :~: b to get out the Refl constructor;
in the body of the pattern-match, the compiler knows that a ~ b.
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.
Instances26MonadFail, …
MonadFailGetDefined in binary-0.8.9.3 · Data.Binary.Get.Internal
MonadFailMaybeDefined in ghc-internal-10.0.0 · GHC.Internal.Control.Monad.Fail
MonadFailQDefined in ghc-internal-10.0.0 · GHC.Internal.TH.Monad
MonadFailPDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadP
MonadFailReadPDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadP
MonadFailReadPrecDefined in ghc-internal-10.0.0 · GHC.Internal.Text.ParserCombinators.ReadPrec
MonadFailIODefined in ghc-internal-10.0.0 · GHC.Internal.Control.Monad.Fail
MonadFail []Defined in ghc-internal-10.0.0 · GHC.Internal.Control.Monad.Fail
Monadm => MonadFail (CatchTm)Defined in exceptions-0.10.12 · Control.Monad.Catch.Pure
Monadm => MonadFail (MaybeTm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Maybe
MonadFailf => MonadFail (Apf)Defined in ghc-internal-10.0.0 · GHC.Internal.Data.Monoid
'Readerizes' the state: the 'ranking' function can see a value of
type s, but not modify it. Effectively, can be thought of as 'extending'
the 'ranking' by all values in s, but whichs gets given to any rank
calls is predetermined by the 'outer state' (and cannot change).
MonadTrans (StateTs)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy
Monadm => Monad (StateTsm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy
Functorm => Functor (StateTsm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy
MonadFixm => MonadFix (StateTsm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy
MonadFailm => MonadFail (StateTsm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.State.Lazy
Provides a read-only environment of type r to the 'strategy' function.
However, the 'ranking' function (or more accurately, representation) has no
access to r. Put another way, you can influence what values get chosen by
changing r, but not how solutions are ranked.
MonadTrans (ReaderTr)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Reader
Monadm => Monad (ReaderTrm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Reader
Functorm => Functor (ReaderTrm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Reader
MonadFixm => MonadFix (ReaderTrm)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Reader
The strategy of combining computations that can throw exceptions
by bypassing bound functions
from the point an exception is thrown to the point that it is handled.
Is parameterized over the type of error information and
the monad type constructor.
It is common to use Either String as the monad type constructor
for an error monad in which error descriptions take the form of strings.
In that case and many other common cases the resulting monad is already defined
as an instance of the MonadError class.
You can also define your own error type and/or use a monad type constructor
other than EitherString or EitherIOError.
In these cases you will have to explicitly define instances of the MonadError
class.
(If you are using the deprecated Control.Monad.Error or
Control.Monad.Trans.Error, you may also have to define an Error instance.)
The parameterizable exception monad, which is strict.
Computations are either exceptions (of any type) or normal values.
These computations are plain values, and are unrelated to the
Control.Exception mechanism, which is tied to the IO monad.
The return function returns a normal value, while >>= exits on
the first exception. For a variant that continues after an error
and collects all the errors, see Errors.
'Extends' the possibilities considered by m to include every value of
e; this means that the potential result could be either a Left (making it
a choice of type e) or a Right (making it a choice of type a).
MonadTrans (ExceptTe)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except
Monadm => Monad (ExceptTem)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except
Functorm => Functor (ExceptTem)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except
MonadFixm => MonadFix (ExceptTem)Defined in transformers-0.6.3.0 · Control.Monad.Trans.Except
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:
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:
Return the value computed by a state thread.
The forall ensures that the internal state used by the ST
computation is inaccessible to the rest of the program.
The strict ST monad.
The ST monad allows for destructive updates, but is escapable (unlike IO).
A computation of type ST s a returns a value of type a, and
execute in "thread" s. The s parameter is either
an uninstantiated type variable (inside invocations of runST), or
Using atomically inside an unsafePerformIO or unsafeInterleaveIO
subverts some of guarantees that STM provides. It makes it possible to
run a transaction inside of another transaction, depending on when the
thunk is evaluated. If a nested transaction is attempted, an exception
is thrown by the runtime. It is possible to safely use atomically inside
unsafePerformIO or unsafeInterleaveIO, but the typechecker does not
rule out programs that may attempt nested transactions, meaning that
the programmer must take special care to prevent these.
catchSTM m f catches any exception thrown by m using throwSTM,
using the function f to handle the exception. If an exception is
thrown, any changes made by m are rolled back, but changes prior to
m persist.
If the first action completes without retrying then it forms the result of
the orElse. Otherwise, if the first action retries, then the second action
is tried in its place. If both actions retry then the orElse as a whole
retries.
Retry execution of the current memory transaction because it has seen
values in TVars which mean that it should not continue (e.g. the TVars
represent a shared buffer that is now empty). The implementation may
block the thread until one of the TVars that it has read from has been
updated. (GHC only)
A variant of throw that can only be used within the STM monad.
Throwing an exception in STM aborts the transaction and propagates the
exception. If the exception is caught via catchSTM, only the changes
enclosed by the catch are rolled back; changes made outside of catchSTM
persist.
If the exception is not caught inside of the STM, it is re-thrown by
atomically, and the entire STM is rolled back.
Although throwSTM has a type that is an instance of the type of throw, the
two functions are subtly different:
throw e `seq` x ===> throw e
throwSTM e `seq` x ===> x
The first example will cause the exception e to be raised,
whereas the second one won't. In fact, throwSTM will only cause
an exception to be raised when it is used within the STM monad.
The throwSTM variant should be used in preference to throw to
raise an exception within the STM monad because it guarantees
ordering with respect to other STM operations, whereas throw
does not.
A fixed-precision integer type with at least the range [-2^29 .. 2^29-1].
The exact range for a given implementation can be determined by using
Prelude.minBound and Prelude.maxBound from the Prelude.Bounded class.
Attempt to convert an Integral type a to an Integral type b using
the size of the types as measured by Bits methods.
A simpler version of this function is:
toIntegral :: (Integral a, Integral b) => a -> Maybe b
toIntegral x
| toInteger x == toInteger y = Just y
| otherwise = Nothing
where
y = fromIntegral x
This version requires going through Integer, which can be inefficient.
However, toIntegralSized is optimized to allow GHC to statically determine
the relative type sizes (as measured by bitSizeMaybe and isSigned) and
avoid going through Integer for many types. (The implementation uses
fromIntegral, which is itself optimized with rules for base types but may
go through Integer for some type pairs.)
shift x i shifts x left by i bits if i is positive,
or right by -i bits otherwise.
Right shifts perform sign extension on signed number types;
i.e. they fill the top bits with 1 if the x is negative
and with 0 otherwise.
An instance can define either this unified shift or shiftL and
shiftR, depending on which is more convenient for the type in
question.
Return the number of bits in the type of the argument. The actual
value of the argument is ignored. Returns Nothing
for types that do not have a fixed bitsize, like Integer.
Return the number of bits in the type of the argument. The actual
value of the argument is ignored. The function bitSize is
undefined for types that do not have a fixed bitsize, like Integer.
Default implementation based upon bitSizeMaybe provided since
4.12.0.0.
Shift the argument left by the specified number of bits
(which must be non-negative). Some instances may throw an
Overflow exception if given a negative input.
An instance can define either this and shiftR or the unified
shift, depending on which is more convenient for the type in
question.
Shift the first argument right by the specified number of bits. The
result is undefined for negative shift amounts and shift amounts
greater or equal to the bitSize. Some instances may throw an
Overflow exception if given a negative input.
Right shifts perform sign extension on signed number types;
i.e. they fill the top bits with 1 if the x is negative
and with 0 otherwise.
An instance can define either this and shiftL or the unified
shift, depending on which is more convenient for the type in
question.
Return the number of bits in the type of the argument.
The actual value of the argument is ignored. Moreover, finiteBitSize
is total, in contrast to the deprecated bitSize function it replaces.
Note: The default implementation for this method is intentionally
naive. However, the instances provided for the primitive
integral types are implemented using CPU specific machine
instructions.
Note: The default implementation for this method is intentionally
naive. However, the instances provided for the primitive
integral types are implemented using CPU specific machine
instructions.
Instances63FiniteBits, …
FiniteBitsEventTypeDefined in ghc-internal-10.0.0 · GHC.Internal.Event.EPoll
FiniteBitsEventDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Poll
FiniteBitsCBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCLLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCPtrdiffDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCSCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCSigAtomicDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCSizeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCUCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCUIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCUIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCUIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCULLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCULongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCUShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsCWcharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
FiniteBitsIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
FiniteBitsWordPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
FiniteBitsInt16Defined in ghc-internal-10.0.0 · GHC.Internal.Int
FiniteBitsInt32Defined in ghc-internal-10.0.0 · GHC.Internal.Int
FiniteBitsInt64Defined in ghc-internal-10.0.0 · GHC.Internal.Int
FiniteBitsInt8Defined in ghc-internal-10.0.0 · GHC.Internal.Int
FiniteBitsCBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCBlkSizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCClockIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCDevDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCFsBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCFsFilCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCGidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCInoDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCKeyDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCModeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCNfdsDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCNlinkDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCOffDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCPidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCRLimDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCSocklenDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCSsizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCTcflagDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsCUidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsFdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
FiniteBitsBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Bits
FiniteBitsIntDefined in ghc-internal-10.0.0 · GHC.Internal.Bits
FiniteBitsWordDefined in ghc-internal-10.0.0 · GHC.Internal.Bits
FiniteBitsWord16Defined in ghc-internal-10.0.0 · GHC.Internal.Word
FiniteBitsWord32Defined in ghc-internal-10.0.0 · GHC.Internal.Word
FiniteBitsWord64Defined in ghc-internal-10.0.0 · GHC.Internal.Word
FiniteBitsWord8Defined in ghc-internal-10.0.0 · GHC.Internal.Word
The function polar takes a complex number and
returns a (magnitude, phase) pair in canonical form:
the magnitude is non-negative, and the phase in the range (-pi, pi];
if the magnitude is zero, then so is the phase.
In haskell, complex numbers are represented as a :+ b which can be thought of
as representing a + bi. For a complex number z, abs z is a number with the magnitude of z,
but oriented in the positive real direction, whereas signum z
has the phase of z, but unit magnitude.
Apart from the loss of precision due to IEEE754 floating point numbers,
it holds that z == abs z * signum z.
Note that Complex's instances inherit the deficiencies from the type
parameter's. For example, Complex Float's Eq instance has similar
problems to Float's.
As can be seen in the examples, the Foldable
and Traversable instances traverse the real part first.
Convert a single digit Char to the corresponding Int. This
function fails unless its argument satisfies isHexDigit, but
recognises both upper- and lower-case hexadecimal digits (that
is, '0'..'9', 'a'..'f', 'A'..'F').
Examples
Characters '0' through '9' are converted properly to
0..9:
Selects alphabetic Unicode characters (lower-case, upper-case and
title-case letters, plus letters of caseless scripts and
modifiers letters). This function is equivalent to
isAlpha.
This function returns True if its argument has one of the
following GeneralCategorys, or False otherwise:
Convert an Int in the range 0..15 to the corresponding single
digit Char. This function fails on other inputs, and generates
lower-case hexadecimal digits.
Selects alphabetic Unicode characters (lower-case, upper-case and
title-case letters, plus letters of caseless scripts and modifiers letters).
This function is equivalent to isLetter.
This function returns True if its argument has one of the
following GeneralCategorys, or False otherwise:
Note that numeric digits outside the ASCII range, as well as numeric
characters which aren't digits, are selected by this function but not by
isDigit. Such characters may be part of identifiers but are not used by
the printer and reader to represent numbers, e.g., Roman numerals like V,
full-width digits like '1' (aka '65297').
This function returns True if its argument has one of the
following GeneralCategorys, or False otherwise:
Note: this predicate does not work for letter-like characters such as:
'ⓐ' (U+24D0 circled Latin small letter a) and
'ⅳ' (U+2173 small Roman numeral four). This is due to selecting only
characters with the GeneralCategoryLowercaseLetter.
Selects upper-case or title-case alphabetic Unicode characters (letters).
Title case is used by a small number of letter ligatures like the
single-character form of Lj.
Note: this predicate does not work for letter-like characters such as:
'Ⓐ' (U+24B6 circled Latin capital letter A) and
'Ⅳ' (U+2163 Roman numeral four). This is due to selecting only
characters with the GeneralCategoryUppercaseLetter or TitlecaseLetter.
See isUpperCase for a more intuitive predicate. Note that
unlike isUpperCase, isUpper does select title-case characters such as
'Dž' (U+01C5 Latin capital letter d with small letter z with caron) or
'ᾯ' (U+1FAF Greek capital letter omega with dasia and perispomeni and
prosgegrammeni).
Convert a letter to the corresponding title-case or upper-case
letter, if any. (Title case differs from upper case only for a small
number of ligature letters.)
Any other character is returned unchanged.
Character literals in Haskell are single-quoted: 'Q', 'Я' or 'Ω'.
To represent a single quote itself use '\'', and to represent a backslash
use '\\'. The full grammar can be found in the section 2.6 of the
Haskell 2010 Language Report.
To specify a character by its code point one can use decimal, hexadecimal
or octal notation: '\65', '\x41' and '\o101' are all alternative forms
of 'A'. The largest code point is '\x10ffff'.
There is a special escape syntax for ASCII control characters:
The catMaybes function takes a list of Maybes and returns
a list of all the Just values.
Examples
Basic usage:
Example1 expression
>>> catMaybes [Just 1, Nothing, Just 3][1,3]
When constructing a list of Maybe values, catMaybes can be used
to return all of the "success" results (if the list is the result
of a map, then mapMaybe would be more appropriate):
Example3 expressions
>>> import GHC.Internal.Text.Read ( readMaybe )>>> [readMaybe x :: Maybe Int | x <- ["1", "Foo", "3"] ][Just 1,Nothing,Just 3]>>> catMaybes $ [readMaybe x :: Maybe Int | x <- ["1", "Foo", "3"] ][1,3]
The fromMaybe function takes a default value and a Maybe
value. If the Maybe is Nothing, it returns the default value;
otherwise, it returns the value contained in the Maybe.
The mapMaybe function is a version of map which can throw
out elements. In particular, the functional argument returns
something of type Maybe b. If this is Nothing, no element
is added on to the result list. If it is Just b, then b is
included in the result list.
Examples
Using mapMaybe f x is a shortcut for catMaybes $ map f x
in most cases:
The maybe function takes a default value, a function, and a Maybe
value. If the Maybe value is Nothing, the function returns the
default value. Otherwise, it applies the function to the value inside
the Just and returns the result.
Examples
Basic usage:
Example1 expression
>>> maybe False odd (Just 3)True
Example1 expression
>>> maybe False odd NothingFalse
Read an integer from a string using readMaybe. If we succeed,
return twice the integer; that is, apply (*2) to it. If instead
we fail to parse an integer, return 0 by default:
Apply show to a Maybe Int. If we have Just n, we want to show
the underlying Intn. But if we have Nothing, we return the
empty string instead of (for example) "Nothing":
Example2 expressions
>>> maybe "" show (Just 5)"5">>> maybe "" show Nothing""
The Maybe type encapsulates an optional value. A value of type
Maybe a either contains a value of type a (represented as Just a),
or it is empty (represented as Nothing). Using Maybe is a good way to
deal with errors or exceptional cases without resorting to drastic
measures such as error.
The Maybe type is also a monad. It is a simple kind of error
monad, where all errors are represented by Nothing. A richer
error monad can be built using the Either type.
Lift a semigroup into Maybe forming a Monoid according to
http://en.wikipedia.org/wiki/Monoid: "Any semigroup S may be
turned into a monoid simply by adjoining an element e not in S
and defining e*e = e and e*s = s = s*e for all s ∈ S."
Since 4.11.0: constraint on inner a value generalised from
Monoid to Semigroup.
SingKinda => SingKind (Maybea)Defined in ghc-internal-10.0.0 · GHC.Internal.Generics
NFDataa => NFData (Maybea)Defined in deepseq-1.5.2.0 · Control.DeepSeq
Prettya => Pretty (Maybea)Defined in pretty-1.1.3.6 · Text.PrettyPrint.Annotated.HughesPJClass
Prettya => Pretty (Maybea)Defined in pretty-1.1.3.6 · Text.PrettyPrint.HughesPJClass
Binarya => Binary (Maybea)Defined in binary-0.8.9.3 · Data.Binary.Class
Datatype to represent metadata associated with a datatype (MetaData),
constructor (MetaCons), or field selector (MetaSel).
In MetaData n m p nt, n is the datatype's name, m is the module in
which the datatype is defined, p is the package in which the datatype
is defined, and nt is 'True if the datatype is a newtype.
In MetaCons n f s, n is the constructor's name, f is its fixity,
and s is 'True if the constructor contains record selectors.
In MetaSel mn su ss ds, if the field uses record syntax, then mn is
Just the record name. Otherwise, mn is Nothing. su and ss are
the field's unpackedness and strictness annotations, and ds is the
strictness that GHC infers for the field.
Decode a ByteString containing UTF-8 encoded text that is known
to be valid.
If the input contains any invalid UTF-8 data, an exception will be
thrown that cannot be caught in pure code. For more control over
the handling of invalid data, use decodeUtf8' or
decodeUtf8With.
This is a partial function: it checks that input is a well-formed
UTF-8 sequence and copies buffer or throws an error otherwise.
The interact function takes a function of type Text -> Text
as its argument. The entire input from the standard input device is
passed to this function as its argument, and the resulting string
is output on the standard output device.
The readFile function reads a file and returns the contents of
the file as a string. The entire file is read strictly, as with
getContents.
Beware that this function (similarly to readFile) is locale-dependent.
Unexpected system locale may cause your application to read corrupted data or
throw runtime exceptions about "invalid argument (invalid byte sequence)"
or "invalid argument (invalid character)". This is also slow, because GHC
first converts an entire input to UTF-32, which is afterwards converted to UTF-8.
If your data is UTF-8,
using decodeUtf8.readFile
is a much faster and safer alternative.
The input value that caused the error. If the error arose
because the end of input was reached or could not be identified
precisely, this value will be Nothing.
If the handler returns a value wrapped with Just, that value will
be used in the output as the replacement for the invalid input. If
it returns Nothing, no value will be used in the output.
Should the handler need to abort processing, it should use error
or throw an exception (preferably a UnicodeException). It may
use the description provided to construct a more helpful error
report.
DataTextDefined in text-2.1.4 · Data.Text · orphan
This instance preserves data abstraction at the cost of inefficiency.
We omit reflection services for the sake of data abstraction.
This instance was created by copying the updated behavior of
Data.Set.Set and Data.Map.Data.Map.Map. If you
feel a mistake has been made, please feel free to submit
improvements.
Derived instances of Read make the following assumptions, which
derived instances of Text.Show.Show obey:
If the constructor is defined to be an infix operator, then the
derived Read instance will parse only infix applications of
the constructor (not the prefix form).
Associativity is not used to reduce the occurrence of parentheses,
although precedence may be.
If the constructor is defined using record syntax, the derived Read
will parse only the record-syntax form, and furthermore, the fields
must be given in the same order as the original declaration.
The derived Read instance allows arbitrary Haskell whitespace
between tokens of the input string. Extra parentheses are also
allowed.
For example, given the declarations
infixr 5 :^:
data Tree a = Leaf a | Tree a :^: Tree a
the derived instance of Read in Haskell 2010 is equivalent to
instance (Read a) => Read (Tree a) where
readsPrec d r = readParen (d > app_prec)
(\r -> [(Leaf m,t) |
("Leaf",s) <- lex r,
(m,t) <- readsPrec (app_prec+1) s]) r
++ readParen (d > up_prec)
(\r -> [(u:^:v,w) |
(u,s) <- readsPrec (up_prec+1) r,
(":^:",t) <- lex s,
(v,w) <- readsPrec (up_prec+1) t]) r
where app_prec = 10
up_prec = 5
Note that right-associativity of :^: is unused.
The derived instance in GHC is equivalent to
instance (Read a) => Read (Tree a) where
readPrec = parens $ (prec app_prec $ do
Ident "Leaf" <- lexP
m <- step readPrec
return (Leaf m))
+++ (prec up_prec $ do
u <- step readPrec
Symbol ":^:" <- lexP
v <- step readPrec
return (u :^: v))
where app_prec = 10
up_prec = 5
readListPrec = readListPrecDefault
Why do both readsPrec and readPrec exist, and why does GHC opt to
implement readPrec in derived Read instances instead of readsPrec?
The reason is that readsPrec is based on the ReadS type, and although
ReadS is mentioned in the Haskell 2010 Report, it is not a very efficient
parser data structure.
readPrec, on the other hand, is based on a much more efficient ReadPrec
datatype (a.k.a "new-style parsers"), but its definition relies on the use
of the RankNTypes language extension. Therefore, readPrec (and its
cousin, readListPrec) are marked as GHC-only. Nevertheless, it is
recommended to use readPrec instead of readsPrec whenever possible
for the efficiency improvements it brings.
As mentioned above, derived Read instances in GHC will implement
readPrec instead of readsPrec. The default implementations of
readsPrec (and its cousin, readList) will simply use readPrec under
the hood. If you are writing a Read instance by hand, it is recommended
to write it like so:
Computation exitWithcode throws ExitCodecode.
Normally this terminates the program, returning code to the
program's caller.
On program termination, the standard Handles stdout and
stderr are flushed automatically; any other buffered Handles
need to be flushed manually, otherwise the buffered data will be
discarded.
A program that fails in any other way is treated as if it had
called exitFailure.
A program that terminates successfully without calling exitWith
explicitly is treated as if it had called exitWithExitSuccess.
Note: in GHC, exitWith should be called from the main program
thread in order to exit the process. When called from another
thread, exitWith will throw an ExitCode as normal, but the
exception will not cause the process itself to exit.
File and directory names are values of type String, whose precise
meaning is operating system dependent. Files can be opened, yielding a
handle which can then be used to operate on the contents of that file.
indicates program failure with an exit code.
The exact interpretation of the code is
operating-system dependent. In particular, some values
may be prohibited (e.g. 0 on a POSIX-compliant system).
Haskell defines operations to read and write characters from and to files,
represented by values of type Handle. Each value of this type is a
handle: a record used by the Haskell run-time system to manage I/O
with file system objects. A handle has at least the following properties:
whether it manages input or output or both;
whether it is open, closed or semi-closed;
whether the object is seekable;
whether buffering is disabled, or enabled on a line or block basis;
a buffer (whose length may be zero).
Most handles will also have a current I/O position indicating where the next
input or output operation will occur. A handle is readable if it
manages only input or both input and output; likewise, it is writable if
it manages only output or both input and output. A handle is open when
first allocated.
Once it is closed it can no longer be used for either input or output,
though an implementation cannot re-use its storage while references
remain to it. Handles are in the Show and Eq classes. The string
produced by showing a handle is system dependent; it should include
enough information to identify the handle for debugging. A handle is
equal according to == only to itself; no attempt
is made to compare the internal state of different handles for equality.
Instances2Eq, Show
EqHandleDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Handle.Types
ShowHandleDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Handle.Types
Cancel an asynchronous action by throwing the AsyncCancelled
exception to it, and waiting for the Async thread to quit.
Has no effect if the Async has already completed.
cancel a = throwTo (asyncThreadId a) AsyncCancelled <* waitCatch a
Note that cancel will not terminate until the thread the Async
refers to has terminated. This means that cancel will block for
as long said thread blocks when receiving an asynchronous exception.
For example, it could block if:
It's executing a foreign call, and thus cannot receive the asynchronous
exception;
It's executing some cleanup handler after having received the exception,
and the handler is blocking.
Run two IO actions concurrently, and return both results. If
either action throws an exception at any time, then the other
action is cancelled, and the exception is re-thrown by
concurrently.
concurrently left right =
withAsync left $ \a ->
withAsync right $ \b ->
waitBoth a b
To run more than two actions concurrently, see mapConcurrently.
Link the given Async to the current thread, such that if the
Async raises an exception, that exception will be re-thrown in
the current thread, wrapped in ExceptionInLinkedThread.
link ignores AsyncCancelled exceptions thrown in the other thread,
so that it's safe to cancel a thread you're linked to. If you want
different behaviour, use linkOnly.
Link two Asyncs together, such that if either raises an
exception, the same exception is re-thrown in the other Async,
wrapped in ExceptionInLinkedThread.
link2 ignores AsyncCancelled exceptions, so that it's possible
to cancel either thread without cancelling the other. If you
want different behaviour, use link2Only.
Check whether an Async has completed yet. If it has not
completed yet, then the result is Nothing, otherwise the result
is Just e where e is Left x if the Async raised an
exception x, or Right a if it returned a value a.
Wait for an asynchronous action to complete, and return its
value. If the asynchronous action threw an exception, then the
exception is re-thrown by wait.
Wait for any of the supplied Asyncs to complete. If the first
to complete throws an exception, then that exception is re-thrown
by waitAny.
The input list must be non-empty.
If multiple Asyncs complete or have completed, then the value
returned corresponds to the first completed Async in the list.
Wait for any of the supplied asynchronous operations to complete.
The value returned is a pair of the Async that completed, and the
result that would be returned by wait on that Async.
The input list must be non-empty.
If multiple Asyncs complete or have completed, then the value
returned corresponds to the first completed Async in the list.
Waits for both Asyncs to finish, but if either of them throws
an exception before they have both finished, then the exception is
re-thrown by waitBoth.
Spawn an asynchronous action in a separate thread, and pass its
Async handle to the supplied function. When the function returns
or throws an exception, uninterruptibleCancel is called on the Async.
withAsync action inner = mask $ \restore -> do
a <- async (restore action)
restore (inner a) `finally` uninterruptibleCancel a
This is a useful variant of async that ensures an Async is
never left running unintentionally.
Note: a reference to the child thread is kept alive until the call
to withAsync returns, so nesting many withAsync calls requires
linear memory.
Fork a thread and call the supplied function when the thread is about
to terminate, with an exception or a returned value. The function is
called with asynchronous exceptions masked.
Block the current thread until data is available to read on the
given file descriptor (GHC only).
This will throw an IOError if the file descriptor was closed
while this thread was blocked. To safely close a file descriptor
that has been used with threadWaitRead, use
closeFdWith.
Returns an STM action that can be used to wait for data
to read from a file descriptor. The second returned value
is an IO action that can be used to deregister interest
in the file descriptor.
Block the current thread until data can be written to the
given file descriptor (GHC only).
This will throw an IOError if the file descriptor was closed
while this thread was blocked. To safely close a file descriptor
that has been used with threadWaitWrite, use
closeFdWith.
Returns an STM action that can be used to wait until data
can be written to a file descriptor. The second returned value
is an IO action that can be used to deregister interest
in the file descriptor.
Duplicate a Chan: the duplicate channel begins empty, but data written to
either channel from then on will be available from both. Hence this creates
a kind of broadcast channel, where data written by anyone is seen by
everyone else.
(Note that a duplicated channel is not equal to its original.
So: fmap (c /=) $ dupChan c returns True for all c.)
Read the next value from the Chan. Blocks when the channel is empty. Since
the read end of a channel is an MVar, this operation inherits fairness
guarantees of MVars (e.g. threads blocked in this operation are woken up in
FIFO order).
Throws BlockedIndefinitelyOnMVar when the channel is
empty and no other thread holds a reference to the channel.
Like forkIO, this sparks off a new thread to run the IO
computation passed as the first argument, and returns the ThreadId
of the newly created thread.
However, forkOS creates a bound thread, which is necessary if you
need to call foreign (non-Haskell) libraries that make use of
thread-local state, such as OpenGL (see Control.Concurrent#boundthreads).
Using forkOS instead of forkIO makes no difference at all to the
scheduling behaviour of the Haskell runtime system. It is a common
misconception that you need to use forkOS instead of forkIO to
avoid blocking all the Haskell threads when making a foreign call;
this isn't the case. To allow foreign calls to be made without
blocking all the Haskell threads (with GHC), it is only necessary to
use the -threaded option when linking your program, and to make sure
the foreign import is not marked unsafe.
Run the IO computation passed as the first argument. If the calling thread
is not bound, a bound thread is created temporarily. runInBoundThread
doesn't finish until the IO computation finishes.
You can wrap a series of foreign function calls that rely on thread-local state
with runInBoundThread so that you can use them without knowing whether the
current thread is bound.
Run the IO computation passed as the first argument. If the calling thread
is bound, an unbound thread is created temporarily using forkIO.
runInBoundThread doesn't finish until the IO computation finishes.
Use this function only in the rare case that you have actually observed a
performance loss due to the use of bound threads. A program that
doesn't need its main thread to be bound and makes heavy use of concurrency
(e.g. a web server), might want to wrap its main action in
runInUnboundThread.
Note that exceptions which are thrown to the current thread are thrown in turn
to the thread that is executing the given computation. This ensures there's
always a way of killing the forked thread.
Suspends the current thread for a given number of microseconds
(GHC only).
There is no guarantee that the thread will be rescheduled promptly
when the delay has expired, but the thread will never continue to
run earlier than specified.
Be careful not to exceed maxBound :: Int, which on 32-bit machines is only
2147483647 μs, less than 36 minutes.
Consider using Control.Concurrent.Thread.Delay.delay from unbounded-delays package.
Creates a new thread to run the IO computation passed as the
first argument, and returns the ThreadId of the newly created
thread.
The new thread will be a lightweight, unbound thread. Foreign calls
made by this thread are not guaranteed to be made by any particular OS
thread; if you need foreign calls to be made by a particular OS
thread, then use forkOS instead.
The new thread inherits the masked state of the parent (see
GHC.Control.Exception.mask).
WARNING: Exceptions in the new thread will not be rethrown in the thread that
created it. This means that you might be completely unaware of the problem
if/when this happens. You may want to use the
async library instead.
Like forkIO, but the child thread is passed a function that can
be used to unmask asynchronous exceptions. This function is
typically used in the following way
so that the exception handler in the child thread is established
with asynchronous exceptions masked, meanwhile the main body of
the child thread is executed in the unmasked state.
Note that the unmask function passed to the child thread should
only be used in that thread; the behaviour is undefined if it is
invoked in a different thread.
Like forkIO, but lets you specify on which capability the thread
should run. Unlike a forkIO thread, a thread created by forkOn
will stay on the same capability for its entire lifetime (forkIO
threads can migrate between capabilities according to the scheduling
policy). forkOn is useful for overriding the scheduling policy when
you know in advance how best to distribute the threads.
The Int argument specifies a capability number (see
getNumCapabilities). Typically capabilities correspond to physical
processors, but the exact behaviour is implementation-dependent. The
value passed to forkOn is interpreted modulo the total number of
capabilities as returned by getNumCapabilities.
GHC note: the number of capabilities is specified by the +RTS -N
option when the program is started. Capabilities can be fixed to
actual processor cores with +RTS -qa if the underlying operating
system supports that, although in practice this is usually unnecessary
(and may actually degrade performance in some cases - experimentation
is recommended).
Returns the number of Haskell threads that can run truly
simultaneously (on separate physical processors) at any given time. To change
this value, use setNumCapabilities.
Make a weak pointer to a ThreadId. It can be important to do
this if you want to hold a reference to a ThreadId while still
allowing the thread to receive the BlockedIndefinitely family of
exceptions (e.g. BlockedIndefinitelyOnMVar). Holding a normal
ThreadId reference will prevent the delivery of
BlockedIndefinitely exceptions because the reference could be
used as the target of throwTo at any time, which would unblock
the thread.
Holding a Weak ThreadId, on the other hand, will not prevent the
thread from receiving BlockedIndefinitely exceptions. It is
still possible to throw an exception to a Weak ThreadId, but the
caller must use deRefWeak first to determine whether the thread
still exists.
Set the number of Haskell threads that can run truly simultaneously
(on separate physical processors) at any given time. The number
passed to forkOn is interpreted modulo this value. The initial
value is given by the +RTS -N runtime flag.
This is also the number of threads that will participate in parallel
garbage collection. It is strongly recommended that the number of
capabilities is not set larger than the number of physical processor
cores, and it may often be beneficial to leave one or more cores free
to avoid contention with other processes in the machine.
Returns the number of the capability on which the thread is currently
running, and a boolean indicating whether the thread is locked to
that capability or not. A thread is locked to a capability if it
was created with forkOn.
The yield action allows (forces, in a co-operative multitasking
implementation) a context-switch to any other currently runnable
threads (if any), and is occasionally useful when implementing
concurrency abstractions.
An exception-safe wrapper for modifying the contents of an MVar.
Like withMVar, modifyMVar will replace the original contents of
the MVar if an exception is raised during the operation. This
function is only atomic if there are no other producers for this
MVar. In other words, it cannot guarantee that, by the time
modifyMVar_ gets the chance to write to the MVar, the value
of the MVar has not been altered by a write operation from another thread.
Take a value from an MVar, put a new value into the MVar and
return the value taken. This function is atomic only if there are
no other producers for this MVar. In other words, it cannot guarantee
that, by the time swapMVar gets the chance to write to the MVar,
the value of the MVar has not been altered
by a write operation from another thread.
withMVar is an exception-safe wrapper for operating on the contents
of an MVar. This operation is exception-safe: it will replace the
original contents of the MVar if an exception is raised (see
Control.Exception). However, it is only atomic if there are no
other producers for this MVar. In other words, it cannot guarantee
that, by the time withMVar gets the chance to write to the MVar,
the value of the MVar has not been altered
by a write operation from another thread.
Notice that the boolean value returned is just a snapshot of
the state of the MVar. By the time you get to react on its result,
the MVar may have been filled (or emptied) - so be extremely
careful when using this operation. Use tryTakeMVar instead if possible.
Put a value into an MVar. If the MVar is currently full,
putMVar will wait until it becomes empty.
There are two further important properties of putMVar:
putMVar is single-wakeup. That is, if there are multiple
threads blocked in putMVar, and the MVar becomes empty,
only one thread will be woken up. The runtime guarantees that
the woken thread completes its putMVar operation.
When multiple threads are blocked on an MVar, they are
woken up in FIFO order. This is useful for providing
fairness properties of abstractions built using MVars.
Atomically read the contents of an MVar. If the MVar is
currently empty, readMVar will wait until it is full.
readMVar is guaranteed to receive the next putMVar.
readMVar is multiple-wakeup, so when multiple readers are
blocked on an MVar, all of them are woken up at the same time.
The runtime guarantees that all woken threads complete their readMVar operation.
Compatibility note: Prior to base 4.7, readMVar was a combination
of takeMVar and putMVar. This mean that in the presence of
other threads attempting to putMVar, readMVar could block.
Furthermore, readMVar would not receive the next putMVar if there
was already a pending thread blocked on takeMVar. The old behavior
can be recovered by implementing 'readMVar as follows:
readMVar :: MVar a -> IO a
readMVar m =
mask_ $ do
a <- takeMVar m
putMVar m a
return a
Return the contents of the MVar. If the MVar is currently
empty, takeMVar will wait until it is full. After a takeMVar,
the MVar is left empty.
There are two further important properties of takeMVar:
takeMVar is single-wakeup. That is, if there are multiple
threads blocked in takeMVar, and the MVar becomes full,
only one thread will be woken up. The runtime guarantees that
the woken thread completes its takeMVar operation.
When multiple threads are blocked on an MVar, they are
woken up in FIFO order. This is useful for providing
fairness properties of abstractions built using MVars.
A non-blocking version of putMVar. The tryPutMVar function
attempts to put the value a into the MVar, returning True if
it was successful, or False otherwise.
A non-blocking version of readMVar. The tryReadMVar function
returns immediately, with Nothing if the MVar was empty, or
Just a if the MVar was full with contents a.
An asynchronous action spawned by async or withAsync.
Asynchronous actions are executed in a separate thread, and
operations are provided for waiting for asynchronous actions to
complete and obtaining their results (see e.g. wait).
Instances4Functor, Eq, Ord, Hashable
FunctorAsyncDefined in async-2.2.6 · Control.Concurrent.Async.Internal
Eq (Asynca)Defined in async-2.2.6 · Control.Concurrent.Async.Internal
Ord (Asynca)Defined in async-2.2.6 · Control.Concurrent.Async.Internal
Hashable (Asynca)Defined in async-2.2.6 · Control.Concurrent.Async.Internal
A value of type Concurrently a is an IO operation that can be
composed with other Concurrently values, using the Applicative
and Alternative instances.
Calling runConcurrently on a value of type Concurrently a will
execute the IO operations it contains concurrently, before
delivering the result of type a.
QSem is a quantity semaphore in which the resource is acquired
and released in units of one. It provides guaranteed FIFO ordering
for satisfying blocked waitQSem calls.
QSemN is a quantity semaphore in which the resource is acquired
and released in arbitrary amounts. It provides guaranteed FIFO ordering
for satisfying blocked waitQSemN calls.
A ThreadId is an abstract type representing a handle to a thread.
ThreadId is an instance of Eq, Ord and Show, where
the Ord instance implements an arbitrary total ordering over
ThreadIds. The Show instance lets you convert an arbitrary-valued
ThreadId to string form; showing a ThreadId value is occasionally
useful when debugging or diagnosing the behaviour of a concurrent
program.
Note: in GHC, if you have a ThreadId, you essentially have
a pointer to the thread itself. This means the thread itself can't be
garbage collected until you drop the ThreadId. This misfeature would
be difficult to correct while continuing to support threadStatus.
Instances5Eq, Ord, Show, NFData, Hashable
EqThreadIdDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
OrdThreadIdDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
ShowThreadIdDefined in ghc-internal-10.0.0 · GHC.Internal.Conc.Sync
NFDataThreadIdDefined in deepseq-1.5.2.0 · Control.DeepSeq
HashableThreadIdDefined in hashable-1.5.1.0 · Data.Hashable.Class
An MVar (pronounced "em-var") is a synchronising variable, used
for communication between concurrent threads. It can be thought of
as a box, which may be empty or full.
Instances3NFData1, Eq, NFData
NFData1MVarDefined in deepseq-1.5.2.0 · Control.DeepSeq
Eq (MVara)Defined in ghc-internal-10.0.0 · GHC.Internal.MVar
Compares the underlying pointers.
NFData (MVara)Defined in deepseq-1.5.2.0 · Control.DeepSeq
NOTE: Only strict in the reference and not the referenced value.
A signed integral type that can be losslessly converted to and from
Ptr. This type is also compatible with the C99 type intptr_t, and
can be marshalled to and from that type safely.
An unsigned integral type that can be losslessly converted to and from
Ptr. This type is also compatible with the C99 type uintptr_t, and
can be marshalled to and from that type safely.
The member functions of this class facilitate writing values of
primitive types to raw memory (which may have been allocated with the
above mentioned routines) and reading values from blocks of raw
memory. The class, furthermore, includes support for computing the
storage requirements and alignment restrictions of storable types.
Memory addresses are represented as values of type Ptr a, for some
a which is an instance of class Storable. The type argument to
Ptr helps provide some valuable type safety in FFI code (you can't
mix pointers of different types without an explicit cast), while
helping the Haskell type system figure out which marshalling method is
needed for a given pointer.
All marshalling between Haskell and a foreign language ultimately
boils down to translating Haskell data structures into the binary
representation of a corresponding data structure of the foreign
language and vice versa. To code this marshalling in Haskell, it is
necessary to manipulate primitive data types stored in unstructured
memory blocks. The class Storable facilitates this manipulation on
all types for which it is instantiated, which are the standard basic
types of Haskell, the fixed size Int types (Int8, Int16,
Int32, Int64), the fixed size Word types (Word8, Word16,
Word32, Word64), StablePtr, all types from Foreign.C.Types,
as well as Ptr.
Instances82Storable, …
StorableEventDefined in ghc-internal-10.0.0 · GHC.Internal.Event.EPoll
StorableEventDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Poll
StorablePollFdDefined in ghc-internal-10.0.0 · GHC.Internal.Event.Poll
StorableFingerprintDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableCBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCClockDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCLLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCPtrdiffDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCSCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCSUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCSigAtomicDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCSizeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCTimeDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUIntMaxDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCULLongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCULongDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUSecondsDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCUShortDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableCWcharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.C.Types
StorableIntPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
StorableWordPtrDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Ptr
StorableHalfWordDefined in ghc-internal-10.0.0 · GHC.Internal.Heap.InfoTable.Types
StorableFLockDefined in ghc-internal-10.0.0 · GHC.Internal.IO.Handle.Lock.LinuxOFD
StorableInt16Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableInt32Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableInt64Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableInt8Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableCBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCBlkSizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCCcDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCClockIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCDevDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCFsBlkCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCFsFilCntDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCGidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCIdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCInoDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCKeyDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCModeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCNfdsDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCNlinkDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCOffDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCPidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCRLimDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCSocklenDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCSpeedDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCSsizeDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCTcflagDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCTimerDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableCUidDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableFdDefined in ghc-internal-10.0.0 · GHC.Internal.System.Posix.Types
StorableBoolDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableCharDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableDoubleDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableFloatDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableIntDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableWordDefined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableWord16Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableWord32Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableWord64Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
StorableWord8Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
Storable ()Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
Storable (ConstPtra)Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
Storable (FunPtra)Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
Storable (Ptra)Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
Storable (StablePtra)Defined in ghc-internal-10.0.0 · GHC.Internal.Foreign.Storable
A stable pointer is a reference to a Haskell expression that is
guaranteed not to be affected by garbage collection, i.e., it will neither be
deallocated nor will the value of the stable pointer itself change during
garbage collection (ordinary references may be relocated during garbage
collection). Consequently, stable pointers can be passed to foreign code,
which can treat it as an opaque reference to a Haskell value.
The StablePtr 0 is reserved for representing NULL in foreign code.
A value of type StablePtr a is a stable pointer to a Haskell
expression of type a.