2012-04-22 11 views
10

Para un proyecto de clase, estoy escribiendo un programa que evalúa el rendimiento de diferentes implementaciones de la misma estructura de datos abstractos. Como utilizo un código idéntico para probar cada uno de ellos, me gustaría poder configurar un alias de módulo en función de la entrada del usuario y simplemente ejecutar ese módulo a través del código de prueba.Alias ​​de módulo condicional

En otras palabras, quiero algo como:

let module M = 
    if model = "tree" then TreeModel else 
    if model = "hash" then HashModel else 
    ListModel 
in ... 

¿Hay alguna manera de que esto funcione, o voy en esto todo el mal?

Respuesta

11

No hay condicionales en el nivel de módulo, pero se puede utilizar módulos de primera clase para esto:

let m = match model with 
    | "tree" -> (module TreeModel : MODEL) 
    | "hash" -> (module HashModel : MODEL) 
    | "list" -> (module ListModel : MODEL) 
in let module M = (val m : MODEL) 
in ... 
+0

¡Gracias, esto era exactamente lo que estaba buscando! –

0

Como seguimiento a @Andreas, al menos en las versiones recientes OCaml También puede escribir :

let (module M : MODEL) = match model with 
    | "tree" -> (module TreeModel : MODEL) 
    | "hash" -> (module HashModel : MODEL) 
    | "list" -> (module ListModel : MODEL) 
in ... 
+0

y con este formulario, no tiene que escribir la información del tipo de módulo en todas las ramas de coincidencia: '(módulo M: MODELO)' es suficiente y se propagará. – lavi