The Haskell 98 Report
top | back | next | contents | function index

E  Compiler Pragmas

Some compiler implementations support compiler pragmas, which are used to give additional instructions or hints to the compiler, but which do not form part of the Haskell language proper and do not change a program's semantics. This section summarizes this existing practice. An implementation is not required to respect any pragma, but the pragma should be ignored if an implementation is not prepared to handle it. Lexically, pragmas appear as comments, except that the enclosing syntax is {-# #-}.

E.1  Inlining

decl -> {-# inline [digit] qvars #-}
decl -> {-# notInline qvars #-}
The optional digit represents the level of optimization at which the inlining is to occur. If omitted, it is assumed to be 0. A compiler may use a numeric optimization level setting in which increasing level numbers indicate increasing amounts of optimization. Trivial inlinings that have no impact on compilation time or code size should have an optimization level of 0; more complex inlinings that may lead to slow compilation or large executables should be associated with higher optimization levels.

Compilers will often automatically inline simple expressions. This may be prevented by the notInline pragma.

E.2  Specialization

decl -> {-# specialize spec1 , ... , speck #-} (k>=1)
spec -> vars :: type
Specialization is used to avoid inefficiencies involved in dispatching overloaded functions. For example, in

factorial :: Num a => a -> a
factorial 0 = 0
factorial n = n * factorial (n-1)
{-# specialize factorial :: Int -> Int,
               factorial :: Integer -> Integer #-}

calls to factorial in which the compiler can detect that the parameter is either Int or Integer will use specialized versions of factorial which do not involve overloaded numeric operations.

E.3  Optimization

decl -> optdecl
exp0 -> optdecl exp0
optdecl -> {-# optimize optd1 , ... , optdk #-} (k >= 1)
optd -> digit
| speed digit
| space digit
| compilationSpeed digit
| debug digit
The optimize pragma provides explicit control over the optimization levels of the compiler. If used as a declaration, this applies to all values defined in the declaration group (and recursively to any nested values). Used as an expression, it applies only to the prefixed expression. If no attribute is named, the speed attribute is assumed.


The Haskell 98 Report
top | back | next | contents | function index
1 February, 1999