2012-01-14 4 views
2

Я хотел бы построить общий матричный модуль, который включает такие общие операции, как длина, ширина, размер, read_element, write_element и т. Д. В качестве матрицы можно было бы определить несколько типов: element array array, element list list или с map, преимущество этого модуля заключается в том, чтобы обрабатывать детали типа матрицы внутри него и не беспокоиться о том уровне, на котором вызывается модуль. На данный момент, я думаю о чем-то следующим образом:Определить матричный модуль в OCaml

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

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

+0

Я чувствую, что вы заново изобретать колесо. Взгляните на Polka http://pop-art.inrialpes.fr/~bjeannet/newpolka/html/polka_72.html#SEC97 – pad

+0

@pad: есть ли у вас какие-либо идеи об этом [вопрос] (http: // stackoverflow. ком/вопросы/8865283/с помощью матрицы--модуль-оф-польки-в-OCaml)? Спасибо – SoftTimur

+0

Извините, я не пользуюсь Полькой. Я упоминаю это здесь, потому что его подпись модуля отлично соответствует вашим требованиям. – pad

ответ

1

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

module MatInt = Matrix(struct type t = int end) 
Смежные вопросы