Adloun

informatique (MP2I/MPI) · Chapitre 2 · Application directe du cours

Lire un type sans le déclarer

Le langage OCaml · niveau 2

Énoncé

Le compilateur infère le type de chacune de ces définitions. Lequel, et pourquoi ?


let f x = x + 1
let g x = x ^ "!"
let h b y = if b then y else y
let k (a, b) = b
let m x = x *. 2.0
let p x y = if x > y then x else y

Corrigé

Les réponses du compilateur, obtenues par ocamlc -i :


val f : int -> int
val g : string -> string
val h : bool -> 'a -> 'a
val k : 'a * 'b -> 'b
val m : float -> float
val p : 'a -> 'a -> 'a

Le raisonnement, à chaque fois, part d'un opérateur et remonte :

  • + est l'addition des int — et d'eux seuls : x est un int.
  • ^ est la concaténation des chaînes : x est une string.
  • Dans h, le if force b à être un bool ; mais rien ne contraint y, dont le type reste variable. La fonction est polymorphe.
  • k ne fait qu'extraire la seconde composante : les deux composantes sont indépendantes, d'où deux variables de type distinctes.
  • *. est la multiplication des flottants : x est un float. C'est le point qui distingue m de f, et il tient à un caractère.
  • Dans p, la comparaison > est polymorphe en OCaml : elle s'applique à deux valeurs de même type quelconque. Les deux arguments et le résultat partagent donc le même type variable.

Ce que l'exercice éprouve. Le type n'est pas une décoration qu'on écrirait pour faire plaisir au compilateur : c'est une conséquence du code, calculée par lui. Un type inféré qui vous surprend est presque toujours le signe que le code ne fait pas ce que vous croyiez. Écrire let moyenne a b = (a + b) / 2 puis découvrir int -> int -> int là où l'on attendait des flottants est le premier diagnostic gratuit du langage.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre