Я хотел бы построить модуль общей матрицы, который включает в себя такие общие операции, как длина, ширина, размер, read_element, write_element и т. Д. Как матрица может быть определена с несколькими типами: element array array
, element list list
или сmap
, преимущество этого модуля состоит в том, чтобы обрабатывать детали типа матрицы внутри него, и не беспокоиться на уровне, где вызывается модуль.В настоящий момент я думаю о чем-то следующем:
module type A_TYPE =
sig
type t
end;;
module matrix =
functor (Elt: A_TYPE)
struct
type element = Elt.t
type t = element array array
(* `element list list` if I want a matrix to be a list of a list *)
let length (m: t) : int =
Array.length a
(* `List.length a` if t = element list list *)
... ...
end
Итак, со стороны можно написать:
module MyInt = struct type t = int end
module MatInt = Matrix(MyInt)
module MyFloat = struct type t = float end
module MatFloat = Matrix(MyFloat)
let m = MatInt.make 3 4 0
let n = MatFloat.make 3 4 0.2
Мои вопросы:
1) Ясначала нужно определить модуль MyInt
, а затем поместить его в функтор для создания MatInt
... Я нашел его избыточным ... Есть ли способ напрямую создать экземпляр модуля матрицы, элементы которого имеют int
в качестве типа?
2) Учитывая, что написано в (* ... *)
, есть ли способ реализовать модуль матрицы таким образом, чтобы он одновременно обрабатывал различные возможности типа матрицы?возможно с сопоставлением с образцом?
Надеюсь, мои вопросы понятны, кто-нибудь может помочь?