let foo = function | `One as x -> x | `Two as x -> x
val foo : [< `One | `Two ] -> [> `One | `Two ] = <fun>
let foo : [< `One ] -> [> `One ] = function | `One as x -> x | `Two as x -> x
let foo : [< `One ] -> [> `One ] = function | `One as x -> x;; | `Two as x -> x --- Warning 11: this match case is unused. val foo : [< `One ] -> [> `One | `Two ] = <fun>
let foo : ([< `One ] -> [> `One ]) & ([< `One | `Two ] -> [> `One | `Two ]) = function | `One as x -> x | `Two as x -> x
foo : (type a < [`One | `Two ]) 'a -> 'a
foo : ('a & [`One | `Two ]) -> ('a & [`One | `Two ])
Optionnel: Selon l'état d'avancement du stage on explorera aussi l'utilisation des types intersections pour la généralisation des variables de rangée pour les types enregistrements (record types). Une fois de plus les types interesections permettent d'enrichir l'inference de types de ML en particulier pour le types enregistrements. On demandera donc d'étudier la meilleure maniere de combiner les deux types de polymorphisme.
|
|