2012-01-15 2 views
5

Я просто определить модуль матрицы следующим образом:полиморфного типа внутри модуля (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 

И let m = Matrix.make 3 4 0 дает мне ошибку Error: This expression has type int but an expression was expected of type Matrix.element. Затем я добавил '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 

Компиляция модуля выдает ошибку Error: Unbound type parameter 'a.

Может ли кто-нибудь сказать мне, как определить тип внутри моего модуля?

ответ

5

Две проблемы: (1) переменные типа нельзя назвать связыванием, как вы пробовали с element, и (2) ваш тип t должен иметь все переменные типа в качестве параметров, если он должен быть полиморфным. То есть, вы либо хотите написать

type 'a t = 'a array array 

или вы должны включить модуль в функтор, где вы берете element в качестве параметра всего модуля.

+0

У меня есть вопрос, можно ли сделать: 'модуль Element = STRUCT типа«а т =»а пусть сравнить = сравнить конец ;; модуль ElementMap = Map.Make (Element) '? Я получаю сообщение «Ошибка: несоответствие подписи:» – codablank1

+0

Это невозможно, потому что Map.Make ожидает тип с типом параметра t. Для этого вам понадобится другая версия Карты. –

Смежные вопросы