Предположим, что я пишу модуль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
?
Да, это то, что я искал! – aycc
В настоящее время я заполняю свою матрицу типами из функции 'КОНТРАССЫ '. Предположим, что это реализация 'C'. 'C' содержит определение типа суммы и, к сожалению, на верхнем уровне матрица отображает значения как' C.blah', если 'blah' был частью типа суммы. Вы знаете, как изменить симпатичный принтер, чтобы он просто отображал 'blah'? – aycc
'open C' должен работать. – camlspotter