Table of Contents
GHC (mostly) conforms to the Haskell 98 Foreign Function Interface
Addendum 1.0, whose definition is available from http://haskell.org/
.
To enable FFI support in GHC, give the -fffi
flag, or
the -fglasgow-exts
flag which implies -fffi
.
The FFI support in GHC diverges from the Addendum in the following ways:
Syntactic forms and library functions proposed in earlier versions of the FFI are still supported for backwards compatibility.
GHC implements a number of GHC-specific extensions to the FFI Addendum. These extensions are described in Section 8.1, “GHC extensions to the FFI Addendum”, but please note that programs using these features are not portable. Hence, these features should be avoided where possible.
The FFI libraries are documented in the accompanying library
documentation; see for example the Foreign
module.
The FFI features that are described in this section are specific to GHC. Avoid them where possible to not compromise the portability of the resulting code.
The following unboxed types may be used as basic foreign types
(see FFI Addendum, Section 3.2): Int#
,
Word#
, Char#
,
Float#
, Double#
,
Addr#
, StablePtr# a
,
MutableByteArray#
, ForeignObj#
,
and ByteArray#
.
The FFI spec requires the IO monad to appear in various places,
but it can sometimes be convenient to wrap the IO monad in a
newtype
, thus:
newtype MyIO a = MIO (IO a)
(A reason for doing so might be to prevent the programmer from calling arbitrary IO procedures in some part of the program.)
The Haskell FFI already specifies that arguments and results of foreign imports and exports will be automatically unwrapped if they are newtypes (Section 3.2 of the FFI addendum). GHC extends the FFI by automatically unnwrapping any newtypes that wrap the IO monad itself. More precisely, wherever the FFI specification requires an IO type, GHC will accept any newtype-wrapping of an IO type. For example, these declarations are OK:
foreign import foo :: Int -> MyIO Int foreign import "dynamic" baz :: (Int -> MyIO Int) -> CInt -> MyIO Int