• # Type fantôme

    Posté par (site web personnel) . En réponse au journal Une petite histoire d'utilisation type fort dans Ocaml. Évalué à 2.

    Punaise, j'avais commencé à écrire un commentaire en se basant sur les types fantômes (ajouter une information qui n'est valable que du compilateur pour restreindre un type trop ouvert) mais ça ne marche pas !!

    Bon, je poste quand même la tentative pour l'histoire...

    # type 'a coordonate = int * int;;
    type 'a coordonate = int * int
    type coord1;;
    type coord2;;

    le 'a indique ici un type abstrait, qui doit être nécessairement renseigné pour être utilisé, ce que nous allons faire :

    # let coord1 x y: coord1 coordonate = x, y;;
    val coord1 : int -> int -> coord1 coordonate = <fun>
    # let coord2 x y: coord2 coordonate = x, y;;
    val coord2 : int -> int -> coord2 coordonate = <fun>

    Malheureusement, les deux types ne sont pas incompatibles comme on pourrait le croire :

    # let a:coord2 coordonate = (coord2 3 4);;
    val a : coord2 coordonate = (3, 4)
    (* on peut caster le résultat sans erreur... *)
    # let a:coord1 coordonate = (coord2 3 4);;
    val a : coord1 coordonate = (3, 4)
    # let a:string coordonate = (coord2 3 4);;
    val a : string coordonate = (3, 4)
    (* soyons fous ! *)
    # let a:string list list list coordonate = (coord2 3 4);;
    val a : string list list list coordonate = (3, 4)

    C'est dommage, je me serai attendu à plus de sûreté sur ce plan là de la part du langage !