2010-03-20 5 views

Répondre

13

Ce n'est qu'une des applications possibles, mais les modules de première classe facilitent le codage des types existentiels, avec essentiellement un module contenant un type existentiel et une valeur utilisant ce type). Par exemple, voir Alain Frisch travailler sur les types dynamiques (code tiré de Alain Frisch travail sur dyntypes: http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/branches/dyntypes/stdlib/dyntypes.ml?view=markup)

module type DYN = sig 
    type t 
    val x: t 
    val t: t ttype 
end 

type dyn = (module DYN) 

let dyn (type s) t x = 
    let module M = struct 
    type t = s 
    let x = x 
    let t = t 
    end 
    in 
    (module M : DYN) 

L'idée ici est que « ttype » est une représentation concrète de ce type, un type de données algébrique Int , Float constructors et ainsi de suite, et vous avez ici une valeur, dont le type est caché, mais qui porte une représentation concrète de ce type, que vous pouvez utiliser par exemple pour obtenir une sérialisation/désérialisation plus sûre.

+0

Nice. Une autre application du même concept que je vois: combiner un type existentiel avec la capacité de "lier" un objet à un autre et de le faire vérifier par le système de types. Par exemple. Créez un curseur pour une connexion à une base de données, puis vérifiez qu'il ne peut pas être utilisé avec une connexion différente. Doux! –

Questions connexes