2012-01-15 22 views
5

acabo de definir un módulo de matriz de la siguiente manera:tipo de polimorfismo dentro de un módulo (OCaml)

module Matrix = 
    struct 
    type element 
    type t = element array array 

    let make (nr: int) (nc: int) (init: element) : t = 
     let result = Array.make nr (Array.make nc init) in 
     for i = 0 to nr - 1 do 
     result.(i) <- Array.make nc init 
     done; 
     result 
    end 

Y let m = Matrix.make 3 4 0 me da un error Error: This expression has type int but an expression was expected of type Matrix.element. Luego añade 'a:

module Matrix = 
    struct 
    type element = 'a 
    type t = element array array 

    let make (nr: int) (nc: int) (init: element) : t = 
     let result = Array.make nr (Array.make nc init) in 
     for i = 0 to nr - 1 do 
     result.(i) <- Array.make nc init 
     done; 
     result 
    end 

La compilación del módulo da un error Error: Unbound type parameter 'a.

¿Alguien podría decirme cómo definir el tipo dentro de mi módulo?

Respuesta

5

Dos problemas: (1) las variables de tipo no pueden nombrarse mediante un enlace, como lo intentó con element, y (2) su tipo t necesita tener todas las variables de tipo como parámetros si se supone que es polimórfico. Es decir, que cualquiera que desee escribir

type 'a t = 'a array array 

o tiene que girar el módulo en un funtor, donde se toma como parámetro element de todo el módulo.

+0

Tengo una pregunta, ¿es posible hacer: 'elemento de módulo = estructura tipo 'A t =' a vamos comparan = comparan final ;; módulo ElementMap = Map.Make (Element) '? Obtengo "Error: falta de coincidencia de firma:" – codablank1

+0

Eso no es posible, porque Map.Make espera un tipo de parámetro t. Necesitarías una versión diferente de Map para hacerlo posible. –