• [^] # Re: Type fantôme

    Posté par . En réponse au journal Une petite histoire d'utilisation type fort dans Ocaml. Évalué à 3.

    Utiliser des types fantômes peut fonctionner, il faut faire cependant attention à quelles égalités de types on rend visible.

    Effectivement, si on exporte l'égalité complète

    type 'a t = int * int

    il est possible de jongler entre les différentes valeurs du paramètre fantôme.

    let x: int t = 0,1
    let y : float t = x

    Mais c'est du au fait que le système de type se rappelle qu'au final 'a t ≡ int * int.
    Pour éviter ce problème, on peut cacher cette égalité de type, soit partiellement

    module P: sig 
     type 'a t = private (int*int)
     val create: int * int -> 'a t 
    end = struct
     type 'a t = int * int
     let create x = x
    end

    soit complètement

    module A: sig
     type 'a t
     val create: int * int -> 'a t
     val extract: 'a t -> int * int
    end = struct 
     type 'a t = int * int 
     let create x = x 
     let extract x = x
    end

    Dans les deux cas, l'égalité de type n'est plus visible, et

    let x : int P.t = P.create (0,1)
    let y : float P.t = x

    est rejetée comme invalide.