INF6120 - Laboratoire 10

Sommaire

Pour ce laboratoire, nous allons utiliser les exemples typing.ml et inference.ml du dépôt d’exemples.

Ce labo réplique certains exercices du laboratoire précédente, mais en faisant des modifications dans les exemples de typages plutôt que dans l’interpréteur.

Vérification de types

Types de fonctions

Soit les fonctions suivantes :

let f = fun x y -> x + y
let g = fun a b -> a (b + 1)
let rec h = fun x -> h x

Les réécrire en annotant avec des informations de typage.

Ajout de comparaisons

Dans typing.ml :

  • Définir les opérateurs < et > qui opèrent sur des nombres. Utiliser un typage fort.
  • Définir l’opérateur = qui compare les types primitifs du langage (booléens, entiers). Utiliser un typage fort.

Nombres réels

Dans typing.ml : ajouter le support pour des nombres réels (représentés par le type float en OCaml), de façon à ce que :

  • on aie un constructeur Float pour introduire une expression représentant un réel
  • les opérations mathématiques soient supportés sur les flottants avec un typage strict (on ne peut pas additionner un réel avec un entier par exemple)

Inférence de types

Types de fonctions

Soit les fonctions suivantes :

let f = fun x y -> x + y
let g = fun a b -> a (b + 1)
let rec h = fun x -> h x

Procéder à une inférence de type à la main :

  1. Quelles sont les contraintes déduites pour chaque fonction ?
  2. Résoudre les contraintes pour trouver un type unique, quand c’est possible.

Ajout de comparaisons

Dans inference.ml :

  • Définir les opérateurs < et > qui opèrent sur des nombres. Utiliser un typage fort.
  • Définir l’opérateur = qui compare les types primitifs du langage (booléens, entiers). Utiliser un typage fort.

Nombres réels

Dans inference.ml : ajouter le support pour des nombres réels (représentés par le type float en OCaml), de façon à ce que :

  • on aie un constructeur Float pour introduire une expression représentant un réel
  • les opérations mathématiques soient supportés sur les flottants avec un typage strict (on ne peut pas additionner un réel avec un entier par exemple)