A foreign import declaration imports an external
function into Haskell. (The name of the external function
is statically known, but the loading/linking of it may very well
be delayed until run-time.) A foreign import declaration is then
(approximately) just a type cast of an external function with a
statically known name.
An extension of foreign import is the support for dynamic type
casts of external names/addresses:
topdecl
: ...
..
| 'foreign' 'import' [callconv] 'dynamic' ['unsafe']
varid :: Addr -> (prim_args -> IO prim_result)
i.e., identical to a foreign import declaration, but for the
specification of dynamic instead of the name of an external
function. The presence of dynamic indicates that when an
application of varid is evaluated, the function pointed to by its
first argument will be invoked, passing it the rest of varid's
arguments.
What are the uses of this? Native invocation of COM methods,
Or the interfacing to any other software component technologies.Haskell libraries that want to be dressed up as C libs (and hence may have to support C callbacks), Haskell code that need to dynamically load and execute code.