Lire un type sans le déclarer
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 2 — Le langage OCaml
É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 yCorrigé
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 desint— et d'eux seuls :xest unint.^est la concaténation des chaînes :xest unestring.- Dans
h, leifforcebà être unbool; mais rien ne contrainty, dont le type reste variable. La fonction est polymorphe. kne fait qu'extraire la seconde composante : les deux composantes sont indépendantes, d'où deux variables de type distinctes.*.est la multiplication des flottants :xest unfloat. C'est le point qui distinguemdef, 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.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.