2010-08-05 23 views
8

Estoy desarrollando algunos algoritmos en OCaml que requieren que algunas partes sean "conectables" para que parte del cálculo se deje en computadores específicos.Usar funtores como interfaces en OCaml

Sólo para dar un ejemplo supongamos que tengo una firma como ésta:

module type Algorithm = sig 
    val feed : float -> unit 
    val nth : int -> (float -> float) 
end 

Y dos implementaciones diferentes que serán Alg1 y Alg2. Este módulo Algorithm debe representar la interfaz para varias implementaciones como estas dos.

Ahora necesito otro componente, vamos a llamarlo Executor que será el módulo que utiliza Alg1 o Alg2 throught su interfaz ..

La lectura sobre funtores parece que yo debería necesitar un funtor que toma un Algorithm y produce a ConcreteExecutor con una implementación específica del algoritmo que necesito. De modo que Executor es un tipo de módulo que está parametrizado sobre uno de sus componentes ..

¿Estoy en lo cierto? ¿Es la mejor manera de obtener lo que necesito? Me pregunto si piensan así porque procedo de un fondo Java/C++, así que estoy acostumbrado a utilizar interfaces y clases abstractas y necesito entrar en este tema de abstracción de módulo/functor de la manera correcta.

¿Cuál es la sintaxis correcta para obtener lo que quiero?

Gracias de antemano

+2

Este es realmente un gran uso de funtores. Los uso en una aplicación de generación de laberinto. Conecta un algoritmo y una representación de laberinto, y estás apagado. Todavía estoy trabajando en la salida que podría ser otro functor para soportar SVG, GraphViz, PDF y PNG. – nlucaroni

+1

@nlucaroni: ¿el código de su aplicación de generación de laberinto está disponible en cualquier lugar? – aneccodeal

Respuesta

4

Sí, suena como funtores son los deseados. De hecho, puede ver cómo la biblioteca estándar usa funtores ya que el código fuente está disponible. En mi máquina está ubicado en /usr/lib/ocaml/3.10.2/. A modo de ejemplo, set.mli contiene lo siguiente:

module type OrderedType = 
    sig 
    type t 
    val compare : t -> t -> int 
    end 

module type S 
    sig 
    ... 
    end 

module Make (Ord : OrderedType) : S with type elt = Ord.t 

Cuando se desea utilizar un conjunto de OCaml que hace:

module SSet = Set.Make(String);; 

Así, con su código, el algoritmo reemplaza OrderedType, alg1/Alg2 reemplaza String, Executor reemplaza a Make, y ConcreteExecutor es el resultado de Executor (Alg1/Alg2). También notará que string.mli/ml no contiene ninguna mención de OrderedType. String es un OrderedType en virtud de que tiene un tipo t que es utilizado por una función comparar. No es necesario que diga explícitamente que String es un OrderedType.

+0

Necesita actualizar ocaml. :) – nlucaroni

+0

¡Ja! Esa es la versión en una máquina a la que no tengo acceso de root. Mi máquina doméstica está más actualizada (aunque ¿quién sabe cuándo llegará Debian a 3.12?). –

+0

Puede tomar algún tiempo, pero usted sabe que la falta de compatibilidad entre las versiones de OCaml es la culpable de los retrasos, ¿no? Los "mantenedores de OCaml" de Debian deben asegurarse de que todos los paquetes de OCaml en Debian compilan con la nueva versión y cambiarlos a la vez. Están haciendo un gran trabajo y no es su culpa. –

Cuestiones relacionadas