Определить матричный модуль в OCaml - PullRequest
2 голосов
/ 14 января 2012

Я хотел бы построить модуль общей матрицы, который включает в себя такие общие операции, как длина, ширина, размер, 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) Учитывая, что написано в (* ... *), есть ли способ реализовать модуль матрицы таким образом, чтобы он одновременно обрабатывал различные возможности типа матрицы?возможно с сопоставлением с образцом?

Надеюсь, мои вопросы понятны, кто-нибудь может помочь?

1 Ответ

1 голос
/ 15 января 2012

Что касается вопроса № 1: вам не нужно определять модуль MyInt, вы можете вырезать этот шаг, выполнив:

 module MatInt = Matrix(struct type t = int end)
...