Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file libraries/base/LICENSE) |
Maintainer | libraries@haskell.org |
Stability | stable |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
The Prelude: a standard module. The Prelude is imported by default into all Haskell modules unless either there is an explicit import statement for it, or the NoImplicitPrelude extension is enabled.
- data Bool :: *
- (&&) :: Bool -> Bool -> Bool
- (||) :: Bool -> Bool -> Bool
- not :: Bool -> Bool
- otherwise :: Bool
- data Maybe a
- maybe :: b -> (a -> b) -> Maybe a -> b
- data Either a b
- either :: (a -> c) -> (b -> c) -> Either a b -> c
- data Ordering :: *
- data Char :: *
- type String = [Char]
- fst :: (a, b) -> a
- snd :: (a, b) -> b
- curry :: ((a, b) -> c) -> a -> b -> c
- uncurry :: (a -> b -> c) -> (a, b) -> c
- class Eq a where
- class Eq a => Ord a where
- class Enum a where
- class Bounded a where
- data Int :: *
- data Integer :: *
- data Float :: *
- data Double :: *
- type Rational = Ratio Integer
- data Word :: *
- class Num a where
- class (Num a, Ord a) => Real a where
- class (Real a, Enum a) => Integral a where
- class Num a => Fractional a where
- class Fractional a => Floating a where
- class (Real a, Fractional a) => RealFrac a where
- class (RealFrac a, Floating a) => RealFloat a where
- subtract :: Num a => a -> a -> a
- even :: Integral a => a -> Bool
- odd :: Integral a => a -> Bool
- gcd :: Integral a => a -> a -> a
- lcm :: Integral a => a -> a -> a
- (^) :: (Num a, Integral b) => a -> b -> a
- (^^) :: (Fractional a, Integral b) => a -> b -> a
- fromIntegral :: (Integral a, Num b) => a -> b
- realToFrac :: (Real a, Fractional b) => a -> b
- class Monoid a where
- class Functor f where
- (<$>) :: Functor f => (a -> b) -> f a -> f b
- class Functor f => Applicative f where
- class Applicative m => Monad m where
- mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
- sequence_ :: (Foldable t, Monad m) => t (m a) -> m ()
- (=<<) :: Monad m => (a -> m b) -> m a -> m b
- class Foldable t where
- class (Functor t, Foldable t) => Traversable t where
- id :: a -> a
- const :: a -> b -> a
- (.) :: (b -> c) -> (a -> b) -> a -> c
- flip :: (a -> b -> c) -> b -> a -> c
- ($) :: (a -> b) -> a -> b
- until :: (a -> Bool) -> (a -> a) -> a -> a
- asTypeOf :: a -> a -> a
- error :: forall r. forall a. HasCallStack => [Char] -> a
- errorWithoutStackTrace :: forall r. forall a. [Char] -> a
- undefined :: forall r. forall a. HasCallStack => a
- seq :: a -> b -> b
- ($!) :: (a -> b) -> a -> b
- map :: (a -> b) -> [a] -> [b]
- (++) :: [a] -> [a] -> [a]
- filter :: (a -> Bool) -> [a] -> [a]
- head :: [a] -> a
- last :: [a] -> a
- tail :: [a] -> [a]
- init :: [a] -> [a]
- null :: Foldable t => t a -> Bool
- length :: Foldable t => t a -> Int
- (!!) :: [a] -> Int -> a
- reverse :: [a] -> [a]
- and :: Foldable t => t Bool -> Bool
- or :: Foldable t => t Bool -> Bool
- any :: Foldable t => (a -> Bool) -> t a -> Bool
- all :: Foldable t => (a -> Bool) -> t a -> Bool
- concat :: Foldable t => t [a] -> [a]
- concatMap :: Foldable t => (a -> [b]) -> t a -> [b]
- scanl :: (b -> a -> b) -> b -> [a] -> [b]
- scanl1 :: (a -> a -> a) -> [a] -> [a]
- scanr :: (a -> b -> b) -> b -> [a] -> [b]
- scanr1 :: (a -> a -> a) -> [a] -> [a]
- iterate :: (a -> a) -> a -> [a]
- repeat :: a -> [a]
- replicate :: Int -> a -> [a]
- cycle :: [a] -> [a]
- take :: Int -> [a] -> [a]
- drop :: Int -> [a] -> [a]
- splitAt :: Int -> [a] -> ([a], [a])
- takeWhile :: (a -> Bool) -> [a] -> [a]
- dropWhile :: (a -> Bool) -> [a] -> [a]
- span :: (a -> Bool) -> [a] -> ([a], [a])
- break :: (a -> Bool) -> [a] -> ([a], [a])
- notElem :: (Foldable t, Eq a) => a -> t a -> Bool
- lookup :: Eq a => a -> [(a, b)] -> Maybe b
- zip :: [a] -> [b] -> [(a, b)]
- zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]
- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
- zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
- unzip :: [(a, b)] -> ([a], [b])
- unzip3 :: [(a, b, c)] -> ([a], [b], [c])
- lines :: String -> [String]
- words :: String -> [String]
- unlines :: [String] -> String
- unwords :: [String] -> String
- type ShowS = String -> String
- class Show a where
- shows :: Show a => a -> ShowS
- showChar :: Char -> ShowS
- showString :: String -> ShowS
- showParen :: Bool -> ShowS -> ShowS
- type ReadS a = String -> [(a, String)]
- class Read a where
- reads :: Read a => ReadS a
- readParen :: Bool -> ReadS a -> ReadS a
- read :: Read a => String -> a
- lex :: ReadS String
- data IO a :: * -> *
- putChar :: Char -> IO ()
- putStr :: String -> IO ()
- putStrLn :: String -> IO ()
- print :: Show a => a -> IO ()
- getChar :: IO Char
- getLine :: IO String
- getContents :: IO String
- interact :: (String -> String) -> IO ()
- type FilePath = String
- readFile :: FilePath -> IO String
- writeFile :: FilePath -> String -> IO ()
- appendFile :: FilePath -> String -> IO ()
- readIO :: Read a => String -> IO a
- readLn :: Read a => IO a
- type IOError = IOException
- ioError :: IOError -> IO a
- userError :: String -> IOError
Standard types, classes and related functions
Basic data types
The Maybe
type encapsulates an optional value. A value of type
either contains a value of type Maybe
aa
(represented as
),
or it is empty (represented as Just
aNothing
). 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.
maybe :: b -> (a -> b) -> Maybe a -> b Source #
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:
>>>
maybe False odd (Just 3)
True
>>>
maybe False odd Nothing
False
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:
>>>
import Text.Read ( readMaybe )
>>>
maybe 0 (*2) (readMaybe "5")
10>>>
maybe 0 (*2) (readMaybe "")
0
Apply show
to a Maybe Int
. If we have Just n
, we want to show
the underlying Int
n
. But if we have Nothing
, we return the
empty string instead of (for example) "Nothing":
>>>
maybe "" show (Just 5)
"5">>>
maybe "" show Nothing
""
The Either
type represents values with two possibilities: a value of
type
is either Either
a b
or Left
a
.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
is the type of values which can be either
a Either
String
Int
String
or an Int
. The Left
constructor can be used only on
String
s, and the Right
constructor can be used only on Int
s:
>>>
let s = Left "foo" :: Either String Int
>>>
s
Left "foo">>>
let n = Right 3 :: Either String Int
>>>
n
Right 3>>>
:type s
s :: Either String Int>>>
:type n
n :: 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
:
>>>
let s = Left "foo" :: Either String Int
>>>
let n = Right 3 :: Either String Int
>>>
fmap (*2) s
Left "foo">>>
fmap (*2) n
Right 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.
>>>
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 Int
s.
>>>
:{
let parseMultiple :: Either String Int parseMultiple = do x <- parseEither '1' y <- parseEither '2' return (x + y)>>>
:}
>>>
parseMultiple
Right 3
But the following should fail overall, since the first operation where
we attempt to parse 'm'
as an Int
will fail:
>>>
:{
let parseMultiple :: Either String Int parseMultiple = do x <- parseEither 'm' y <- parseEither '2' return (x + y)>>>
:}
>>>
parseMultiple
Left "parse error"
Bifunctor Either Source # | |
Show2 Either Source # | |
Read2 Either Source # | |
Ord2 Either Source # | |
Eq2 Either Source # | |
Monad (Either e) Source # | |
Functor (Either a) Source # | |
MonadFix (Either e) Source # | |
Applicative (Either e) Source # | |
Foldable (Either a) Source # | |
Traversable (Either a) Source # | |
Generic1 (Either a) Source # | |
Show a => Show1 (Either a) Source # | |
Read a => Read1 (Either a) Source # | |
Ord a => Ord1 (Either a) Source # | |
Eq a => Eq1 (Either a) Source # | |
(Eq b, Eq a) => Eq (Either a b) Source # | |
(Data a, Data b) => Data (Either a b) Source # | |
(Ord b, Ord a) => Ord (Either a b) Source # | |
(Read b, Read a) => Read (Either a b) Source # | |
(Show b, Show a) => Show (Either a b) Source # | |
Generic (Either a b) Source # | |
Semigroup (Either a b) Source # | |
type Rep1 (Either a) Source # | |
type Rep (Either a b) Source # | |
type (==) (Either k k1) a b Source # | |
either :: (a -> c) -> (b -> c) -> Either a b -> c Source #
Case analysis for the Either
type.
If the value is
, apply the first function to Left
aa
;
if it is
, apply the second function to Right
bb
.
Examples
We create two values of type
, one using the
Either
String
Int
Left
constructor and another using the Right
constructor. Then
we apply "either" the length
function (if we have a String
)
or the "times-two" function (if we have an Int
):
>>>
let s = Left "foo" :: Either String Int
>>>
let n = Right 3 :: Either String Int
>>>
either length (*2) s
3>>>
either length (*2) n
6
The character type Char
is an enumeration whose values represent
Unicode (or equivalently ISO/IEC 10646) characters (see
http://www.unicode.org/ for details). This set extends the ISO 8859-1
(Latin-1) character set (the first 256 characters), which is itself an extension
of the ASCII character set (the first 128 characters). A character literal in
Haskell has type Char
.
To convert a Char
to or from the corresponding Int
value defined
by Unicode, use toEnum
and fromEnum
from the
Enum
class respectively (or equivalently ord
and chr
).
Bounded Char Source # | |
Enum Char Source # | |
Eq Char | |
Data Char Source # | |
Ord Char | |
Read Char Source # | |
Show Char Source # | |
Ix Char Source # | |
Storable Char Source # | |
IsChar Char Source # | |
PrintfArg Char Source # | |
Functor (URec Char) Source # | |
Foldable (URec Char) Source # | |
Traversable (URec Char) Source # | |
Generic1 (URec Char) Source # | |
Eq (URec Char p) # | |
Ord (URec Char p) # | |
Show (URec Char p) Source # | |
Generic (URec Char p) Source # | |
data URec Char Source # | Used for marking occurrences of |
type Rep1 (URec Char) Source # | |
type Rep (URec Char p) Source # | |
Tuples
curry :: ((a, b) -> c) -> a -> b -> c Source #
curry
converts an uncurried function to a curried function.
uncurry :: (a -> b -> c) -> (a, b) -> c Source #
uncurry
converts a curried function to a function on pairs.
Basic type classes
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
.
Eq Bool | |
Eq Char | |
Eq Double | |
Eq Float | |
Eq Int | |
Eq Int8 # | |
Eq Int16 # | |
Eq Int32 # | |
Eq Int64 # | |
Eq Integer | |
Eq Ordering | |
Eq Word | |
Eq Word8 # | |
Eq Word16 # | |
Eq Word32 # | |
Eq Word64 # | |
Eq TypeRep # | |
Eq () | |
Eq TyCon | |
Eq BigNat | |
Eq SrcLoc # | |
Eq GeneralCategory # | |
Eq Number # | |
Eq Lexeme # | |
Eq IOMode # | |
Eq SomeSymbol # | |
Eq SomeNat # | |
Eq Fingerprint # | |
Eq ArithException # | |
Eq ErrorCall # | |
Eq IOException # | |
Eq MaskingState # | |
Eq DecidedStrictness # | |
Eq SourceStrictness # | |
Eq SourceUnpackedness # | |
Eq Associativity # | |
Eq Fixity # | |
Eq Any # | |
Eq All # | |
Eq SeekMode # | |
Eq IODeviceType # | |
Eq CUIntMax # | |
Eq CIntMax # | |
Eq CUIntPtr # | |
Eq CIntPtr # | |
Eq CSUSeconds # | |
Eq CUSeconds # | |
Eq CTime # | |
Eq CClock # | |
Eq CSigAtomic # | |
Eq CWchar # | |
Eq CSize # | |
Eq CPtrdiff # | |
Eq CDouble # | |
Eq CFloat # | |
Eq CULLong # | |
Eq CLLong # | |
Eq CULong # | |
Eq CLong # | |
Eq CUInt # | |
Eq CInt # | |
Eq CUShort # | |
Eq CShort # | |
Eq CUChar # | |
Eq CSChar # | |
Eq CChar # | |
Eq IntPtr # | |
Eq WordPtr # | |
Eq BufferState # | |
Eq CodingProgress # | |
Eq NewlineMode # | |
Eq Newline # | |
Eq BufferMode # | |
Eq Handle # | |
Eq IOErrorType # | |
Eq ExitCode # | |
Eq ArrayException # | |
Eq AsyncException # | |
Eq Errno # | |
Eq ThreadStatus # | |
Eq BlockReason # | |
Eq ThreadId # | |
Eq Fd # | |
Eq CRLim # | |
Eq CTcflag # | |
Eq CSpeed # | |
Eq CCc # | |
Eq CUid # | |
Eq CNlink # | |
Eq CGid # | |
Eq CSsize # | |
Eq CPid # | |
Eq COff # | |
Eq CMode # | |
Eq CIno # | |
Eq CDev # | |
Eq Lifetime # | |
Eq Event # | |
Eq FdKey # | |
Eq TimeoutKey # | |
Eq HandlePosn # | |
Eq Unique # | |
Eq Version # | |
Eq Fixity # | |
Eq ConstrRep # | |
Eq DataRep # | |
Eq Constr # | Equality of constructors |
Eq Void # | |
Eq Natural # | |
Eq SpecConstrAnnotation # | |
Eq a => Eq [a] | |
Eq a => Eq (Maybe a) # | |
Eq a => Eq (Ratio a) # | |
Eq (StablePtr a) # | |
Eq (Ptr a) # | |
Eq (FunPtr a) # | |
Eq (V1 p) # | |
Eq (U1 p) # | |
Eq p => Eq (Par1 p) # | |
Eq (MVar a) # | |
Eq a => Eq (Down a) # | |
Eq (IORef a) # | |
Eq a => Eq (Last a) # | |
Eq a => Eq (First a) # | |
Eq a => Eq (Product a) # | |
Eq a => Eq (Sum a) # | |
Eq a => Eq (Dual a) # | |
Eq (ForeignPtr a) # | |
Eq (TVar a) # | |
Eq a => Eq (ZipList a) # | |
Eq (Chan a) # | |
Eq (StableName a) # | |
Eq a => Eq (Complex a) # | |
Eq (Fixed a) # | |
Eq a => Eq (NonEmpty a) # | |
Eq a => Eq (Option a) # | |
Eq m => Eq (WrappedMonoid m) # | |
Eq a => Eq (Last a) # | |
Eq a => Eq (First a) # | |
Eq a => Eq (Max a) # | |
Eq a => Eq (Min a) # | |
Eq a => Eq (Identity a) # | |
(Eq b, Eq a) => Eq (Either a b) # | |
Eq (f p) => Eq (Rec1 f p) # | |
Eq (URec Char p) # | |
Eq (URec Double p) # | |
Eq (URec Float p) # | |
Eq (URec Int p) # | |
Eq (URec Word p) # | |
Eq (URec (Ptr ()) p) # | |
(Eq a, Eq b) => Eq (a, b) | |
Eq (STRef s a) # | |
Eq (Proxy k s) # | |
Eq a => Eq (Arg a b) # | |
Eq c => Eq (K1 i c p) # | |
(Eq (g p), Eq (f p)) => Eq ((:+:) f g p) # | |
(Eq (g p), Eq (f p)) => Eq ((:*:) f g p) # | |
Eq (f (g p)) => Eq ((:.:) f g p) # | |
(Eq a, Eq b, Eq c) => Eq (a, b, c) | |
Eq ((:~:) k a b) # | |
Eq (Coercion k a b) # | |
Eq (f a) => Eq (Alt k f a) # | |
Eq a => Eq (Const k a b) # | |
Eq (f p) => Eq (M1 i c f p) # | |
(Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) | |
(Eq1 f, Eq1 g, Eq a) => Eq (Product * f g a) # | |
(Eq1 f, Eq1 g, Eq a) => Eq (Sum * f g a) # | |
(Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e) | |
(Eq1 f, Eq1 g, Eq a) => Eq (Compose * * f g a) # | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) => Eq (a, b, c, d, e, f) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) => Eq (a, b, c, d, e, f, g) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h) => Eq (a, b, c, d, e, f, g, h) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i) => Eq (a, b, c, d, e, f, g, h, i) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j) => Eq (a, b, c, d, e, f, g, h, i, j) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k) => Eq (a, b, c, d, e, f, g, h, i, j, k) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l) => Eq (a, b, c, d, e, f, g, h, i, j, k, l) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n) | |
(Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g, Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o) => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) | |
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.
Minimal complete definition: either compare
or <=
.
Using compare
can be more efficient for complex types.
compare :: a -> a -> Ordering #
(<) :: a -> a -> Bool infix 4 #
(<=) :: a -> a -> Bool infix 4 #
(>) :: a -> a -> Bool infix 4 #
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:
- The calls
andsucc
maxBound
should result in a runtime error.pred
minBound
fromEnum
andtoEnum
should give a runtime error if the result value is not representable in the result type. For example,
is an error.toEnum
7 ::Bool
enumFrom
andenumFromThen
should be defined with an implicit bound, thus:
enumFrom x = enumFromTo x maxBound enumFromThen x y = enumFromThenTo x y bound where bound | fromEnum y >= fromEnum x = maxBound | otherwise = minBound
the successor of a value. For numeric types, succ
adds 1.
the predecessor of a value. For numeric types, pred
subtracts 1.
Convert from an Int
.
Convert to an Int
.
It is implementation-dependent what fromEnum
returns when
applied to a value that is too large to fit in an Int
.
Used in Haskell's translation of [n..]
.
enumFromThen :: a -> a -> [a] Source #
Used in Haskell's translation of [n,n'..]
.
enumFromTo :: a -> a -> [a] Source #
Used in Haskell's translation of [n..m]
.
enumFromThenTo :: a -> a -> a -> [a] Source #
Used in Haskell's translation of [n,n'..m]
.
class Bounded a where Source #
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
.