base-4.7.0.0: Basic libraries

Copyright(c) The University of Glasgow 2002
License(c) The University of Glasgow 2002
Maintainercvs-ghc@haskell.org
Stabilityinternal
Portabilitynon-portable (GHC Extensions)
Safe HaskellUnsafe

GHC.Exts

Contents

Description

GHC Extensions: this is the Approved Way to get at GHC-specific extensions.

Note: no other base module should import this module.

Synopsis

Representations of some basic types

data Int Source

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 minBound and maxBound from the Bounded class.

Constructors

I# Int# 

data Word Source

A Word is an unsigned integral type, with the same size as Int.

Constructors

W# Word# 

data Float Source

Single-precision floating point numbers. It is desirable that this type be at least equal in range and precision to the IEEE single-precision type.

Constructors

F# Float# 

data Double Source

Double-precision floating point numbers. It is desirable that this type be at least equal in range and precision to the IEEE double-precision type.

Constructors

D# Double# 

data Char Source

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).

Constructors

C# Char# 

data Ptr a Source

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.

Constructors

Ptr Addr# 

Instances

Typeable1 Ptr 
Eq (Ptr a) 
(Data a, Typeable * a) => Data (Ptr a) 
Ord (Ptr a) 
Show (Ptr a) 
Storable (Ptr a) 
Typeable (* -> *) Ptr 

data FunPtr a Source

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

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

 foreign import ccall "stdlib.h &free"
   p_free :: FunPtr (Ptr a -> IO ())

or a pointer to a Haskell function created using a wrapper stub declared to produce a FunPtr of the correct type. For example:

 type Compare = Int -> Int -> Bool
 foreign import ccall "wrapper"
   mkCompare :: Compare -> IO (FunPtr Compare)

Calls to wrapper stubs like mkCompare allocate storage, which should be released with freeHaskellFunPtr when no longer required.

To convert FunPtr values to corresponding Haskell functions, one can define a dynamic stub for the specific foreign type, e.g.

 type IntFunction = CInt -> IO ()
 foreign import ccall "dynamic" 
   mkFun :: FunPtr IntFunction -> IntFunction

Constructors

FunPtr Addr# 

Instances

The maximum tuple size

Primitive operations

module GHC.Prim

shiftL# :: Word# -> Int# -> Word#Source

Shift the argument left by the specified number of bits (which must be non-negative).

shiftRL# :: Word# -> Int# -> Word#Source

Shift the argument right by the specified number of bits (which must be non-negative).

iShiftL# :: Int# -> Int# -> Int#Source

Shift the argument left by the specified number of bits (which must be non-negative).

iShiftRA# :: Int# -> Int# -> Int#Source

Shift the argument right (signed) by the specified number of bits (which must be non-negative).

iShiftRL# :: Int# -> Int# -> Int#Source

Shift the argument right (unsigned) by the specified number of bits (which must be non-negative).

Fusion

build :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]Source

A list producer that can be fused with foldr. This function is merely

    build g = g (:) []

but GHC's simplifier will transform an expression of the form foldr k z (build g), which may arise after inlining, to g k z, which avoids producing an intermediate list.

augment :: forall a. (forall b. (a -> b -> b) -> b -> b) -> [a] -> [a]Source

A list producer that can be fused with foldr. This function is merely

    augment g xs = g (:) xs

but GHC's simplifier will transform an expression of the form foldr k z (augment g xs), which may arise after inlining, to g k (foldr k z xs), which avoids producing an intermediate list.

Overloaded string literals

class IsString a whereSource

Class for string-like datastructures; used by the overloaded string extension (-XOverloadedStrings in GHC).

Methods

fromString :: String -> aSource

Instances

Debugging

Ids with special behaviour

lazy :: a -> aSource

The lazy function restrains strictness analysis a little. The call '(lazy e)' means the same as e, but lazy has a magical property so far as strictness analysis is concerned: it is lazy in its first argument, even though its semantics is strict. After strictness analysis has run, calls to lazy are inlined to be the identity function.

This behaviour is occasionally useful when controlling evaluation order. Notably, lazy is used in the library definition of par:

 par :: a -> b -> b
 par x y = case (par# x) of _ -> lazy y

If lazy were not lazy, par would look strict in y which would defeat the whole purpose of par.

Like seq, the argument of lazy can have an unboxed type.

inline :: a -> aSource

The call '(inline f)' arranges that f is inlined, regardless of its size. More precisely, the call '(inline f)' rewrites to the right-hand side of 'f'\'s definition. This allows the programmer to control inlining from a particular call site rather than the definition site of the function (c.f. INLINE pragmas).

This inlining occurs regardless of the argument to the call or the size of 'f'\'s definition; it is unconditional. The main caveat is that 'f'\'s definition must be visible to the compiler; it is therefore recommended to mark the function with an INLINABLE pragma at its definition so that GHC guarantees to record its unfolding regardless of size.

If no inlining takes place, the inline function expands to the identity function in Phase zero, so its use imposes no overhead.

Transform comprehensions

newtype Down a Source

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

Constructors

Down a 

Instances

Eq a => Eq (Down a) 
Ord a => Ord (Down a) 

groupWith :: Ord b => (a -> b) -> [a] -> [[a]]Source

The groupWith function uses the user supplied function which projects an element out of every list element in order to first sort the input list and then to form groups by equality on these projected elements

sortWith :: Ord b => (a -> b) -> [a] -> [a]Source

The sortWith function sorts a list of elements using the user supplied function to project something out of each element

the :: Eq a => [a] -> aSource

the ensures that all the elements of the list are identical and then returns that unique element

Event logging

traceEvent :: String -> IO ()Source

Deprecated: Use Debug.Trace.traceEvent or Debug.Trace.traceEventIO

SpecConstr annotations

The call stack

currentCallStack :: IO [String]Source

returns a '[String]' representing the current call stack. This can be useful for debugging.

The implementation uses the call-stack simulation maintined 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 Constraint kind

Overloaded lists

class IsList l whereSource

The IsList class and its methods are intended to be used in conjunction with the OverloadedLists extension.

Associated Types

type Item l Source

The Item type function returns the type of items of the structure l.

Methods

fromList :: [Item l] -> lSource

The fromList function constructs the structure l from the given list of Item l

fromListN :: Int -> [Item l] -> lSource

The fromListN function takes the input list's length as a hint. Its behaviour should be equivalent to fromList. The hint can be used to construct the structure l more efficiently compared to fromList. If the given hint does not equal to the input list's length the behaviour of fromListN is not specified.

toList :: l -> [Item l]Source

The toList function extracts a list of Item l from the structure l. It should satisfy fromList . toList = id.

Instances

IsList [a]