Programmation Fonctionnelle Avanc´ee – Master 1
TP 11
Mehdi Dogguy
Pour utiliser du code Cdepuis votre code Haskell, il faut utiliser la FFI
(the Foreign Function Interface). Pour ce faire, il suffit de rajouter, au d´ebut
de votre code Haskell l’en-tˆete suivant :
{-# LANGUAGE ForeignFunctionInterface #-}
Ensuite, pour pouvoir utiliser les types C, il suffit d’importer (suivant les
besoins) quelques modules :
import Foreign.C.Types -- D´efinitions de types
import Foreign.C.String -- Fonctions sur CChar et CString
import Foreign.Ptr -- Pointeurs (d´efinition et op´erations usuelles)
Enfin, vous pouvez commencer `a importer les fonctions Cqui vous
int´eressent dans le monde Haskell. Cette op´eration est r´ealis´ee par le bout de
code suivant :
foreign import ccall "fonction_c" fonction :: Signature
o`u :
–ccall repr´esente la convention d’appel utilis´ee. ccall repr´esente celle uti-
lis´ee par C, mais il en existe d’autres comme : cplusplus,dotnet,jvm,
etc. . . Durant ce TP, on va se limiter `a ccall seulement.
–fonction cle nom de la fonction C`a importer, potentiellement pr´ec´ed´e
par le nom du module qui la d´efinit (Exemple : math.h d´efinit, entre
autres, les fonctions cos et sin) et s´epar´es par un espace.
–fonction le nom de la fonction Haskell, dont la signature est Signature,
que vous allez utiliser dans votre code Haskell. Notez que la Signature
devra utiliser les types d´efinis dans Foreign.C.Types.
En C, une fonction qui retourne void peut avoir des effets de bord pendant
son ex´ecution. En Haskell, ces fonctions impures doivent retourner IO (). De
fa¸con plus g´en´erale, les fonctions Cimpures qui retournent un type tdoivent
ˆetre import´ees en tant que fonctions retournant un type IO t’, o`u le type t’
correspond `a la version Haskell du type Ct.
La suite du TP se d´eroulera en deux parties. Dans un premier temps, nous
allons voir comment interfacer Haskell avec Cpour des fonctions simples. En-
suite, nous allons essayer de coder un vrai programme qui utilise la bibilioth`eque
zlib.