To bind a Haskell variable name and type to an external function, we
introduce a new construct: foreign import. It defines the type of
a Haskell function together with the name of an external function that
actually implements it. The syntax of foreign import construct is
as follows:
topdecl
: ...
..
| 'foreign' 'import' [callconv] [ext_fun] ['unsafe'] varid '::' prim_type
A foreign import declaration is only allowed as a toplevel
declaration. It consists of two parts, one giving the Haskell type
(prim_type), Haskell name (varid) and a flag indicating whether the
primitive is unsafe, the other giving details of the name of the
external function (ext_fun) and its calling interface
(callconv.)
Giving a Haskell name and type to an external entry point is clearly
an unsafe thing to do, as the external name will in most cases be
untyped. The onus is on the programmer using foreign import to
ensure that the Haskell type given correctly maps on to the
type of the external function. Section
Type mapping specifies the mapping from
Haskell types to external types.