• [^] # Re: Reason

    Posté par . En réponse à la dépêche OCaml 4.04 et 4.05. Évalué à 3.

    Petite précision : quand j'ai dit qu'il n'est pas possible de parémétrer un type par des valeurs, ce n'est pas tout à fait vrai. C'est possible via des foncteurs, mais la garantie des invariants doit être contrôlée dynamiquement. Michaël en a donné un exemple.

    On peut par exemple faire un type d'entier borné ainsi :

    module type Bound = sig
     val min : int
     val max : int
    end;;
    module type Range = sig
     type t
     val min : t
     val max : t
     val of_int : int -> t
     val to_int : t -> int
    end;;
    module Range (X : Bound) : Range = struct
     type t = int
     let min = X.min
     let max = X.max
     let to_int i = i
     let of_int = function
     | i when i < min -> failwith "out of bound"
     | i when i > max -> failwith "out of bound"
     | i -> i
    end;;
    module M = Range (struct let min = 1 let max = 10 end);;
    let i = M.of_int 5;;
    val i : M.t = <abstr>
    M.to_int i;;
    - : int = 5
    M.of_int 15;;
    Exception: Failure "out of bound".

    Ici le module X qui paramétrise le foncteur fournit les valeurs min et max qui définisse le segment et paramétrise donc le type t. Néanmoins il faut contrôler dynamiquement que l'on est bien dans les bornes.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.