Département d'Informatique
Licence Informatique 2001-2002
Programmation Fonctionnelle
22 octobre



Correction et inférence de type
(ou comment aider le programmeur à écrire des programmes corrects)



I   Types de base -- Types des fonctions et n-uplets

  1. Les expressions suivantes sont-elles bien typées ? (Vérifier le type des sous-expressions).

    1. if 0=1 then 0 else true;;

    2. let t=0 in if t=1 then 0 else t;;

    3. let a=1 in let b=2. in a+(if b>0. then a else -a);;

    4. let sum (a,b) = a+b in sum (4.,3);;

    5. let sum a b = a+b in sum 4 3;;

    6. (+) 4 3;;

    7. let add = function x -> (function y -> x+.y) in add 4.;;

    8. function f -> (function x -> (f (x+1) - 1));;

    9. let f x = function y -> 2*x+y;;

    10. (function x -> not (not x)) false;;

  2. Pour chacun des types suivants, donner une expression ayant ce type:
    1. int -> float -> int

    2. (int -> int) -> int

    3. (int -> int) -> int -> int

    4. int * bool * int -> int * int

    5. (int -> bool) * (bool -> int)

II   Fonctions polymorphes -- Variables de type

  1. Déterminer le type de f dans les expressions suivantes:
    1. let f x = 1;;

    2. let f x = x;;

    3. let f x y = x = y;;

    4. let f (x,y) = x;;

    5. let f g x = g x;;

    6. let f x = x x;;

    1. Ecrire une fonction curry qui retourne la forme curryfiée d'une fonction:
      quel est son type ? Qu'en est-il de l'inverse de curry (uncurry) ?

    2. Quel est le type de la fonction qui retourne la composée de 2 fonctions ?
      Que dirait-on en termes mathématiques ?










This document was translated from LATEX by HEVEA.