2015-03-25 2 views
3

Предположим, что я пишу модульOCaml: Альтернативные способы воздействия абстрактного типа

module type MAT = 
sig 
    type dtypes 
    type 'a vec 
    type mat 
    val nan : dtypes 

    val make : rows:int -> cols:int -> mat 
    val copy_col : mat -> int -> dtypes vec 
    val write_col : dtypes vec -> mat -> int -> unit 
    val row : mat -> int -> dtypes vec 

end;; 

матрица с конкретной реализацией

module MyMat(C:CONSTRAINTS) : (MAT with type dtypes = C.dtypes) = 
struct 
    type dtypes = C.dtypes 
    type 'a vec = 'a array 
    type mat = C.dtypes vec vec 
    let nan = C.nan 

    let make ~rows ~cols = Array.make_matrix rows cols nan 

    let copy_col mat int = 
    let rows = Array.length mat in 
    let copy = Array.make rows nan in 
    let rec aux n = 
     if (n = rows) then copy else (copy.(n) <- mat.(n).(int); aux (n + 1)) 
    in aux 0 

    let write_col vec mat int = 
    let rows = Array.length mat in 
    let rec aux n = 
     if (n = rows) then() else (mat.(n).(int) <- vec.(n);aux (n+1)) 
    in aux 0 

    let row m n = m.(n) 

end;; 

В конкретной реализации, модуль массива используется для vec и mat. У меня есть три функции: copy_col, write_col и row, которые возвращают/записывают фрагменты из/в матрицу. Я хотел сохранить абстракцию модуля, поэтому в подписи я не указывал тип 'a vec или mat. Однако это скрывает тип 'a array, поэтому, когда я использую эти функции, я не могу выполнять операции с массивом, такие как a.() и так далее. Есть ли способ опубликовать абстрактный тип для MyMat, сохраняя его для MAT?

ответ

5

Вы хотите следующее?

module MyMat(C:CONSTRAINTS) : (MAT with type dtypes = C.dtypes 
            and type 'a vec = 'a array) = ... 
+0

Да, это то, что я искал! – aycc

+0

В настоящее время я заполняю свою матрицу типами из функции 'КОНТРАССЫ '. Предположим, что это реализация 'C'. 'C' содержит определение типа суммы и, к сожалению, на верхнем уровне матрица отображает значения как' C.blah', если 'blah' был частью типа суммы. Вы знаете, как изменить симпатичный принтер, чтобы он просто отображал 'blah'? – aycc

+1

'open C' должен работать. – camlspotter

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