Module 在OCaml中定义矩阵模块

Module 在OCaml中定义矩阵模块,module,matrix,ocaml,Module,Matrix,Ocaml,我想构建一个通用矩阵模块,其中包括长度、宽度、大小、读取元素、写入元素等一般操作。因为矩阵可以定义为几种类型:元素数组,元素列表或映射,这个模块的优点是可以处理其中矩阵类型的细节,而不必在调用模块的级别上费心。目前,我想到的是: module type A_TYPE = sig type t end;; module matrix = functor (Elt: A_TYPE) struct type element = Elt.t type t =

我想构建一个通用矩阵模块,其中包括长度、宽度、大小、读取元素、写入元素等一般操作。因为矩阵可以定义为几种类型:
元素数组
元素列表
映射
,这个模块的优点是可以处理其中矩阵类型的细节,而不必在调用模块的级别上费心。目前,我想到的是:

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
,然后将其放入functor中以创建
MatInt
。。。我觉得这是多余的。。。有没有一种方法可以直接实例化元素类型为
int
的矩阵模块

2) 考虑到在
(*…*)
中编写的内容,是否有一种方法可以实现矩阵模块,使其同时处理矩阵类型的不同可能性?也许用模式匹配

希望我的问题很清楚,有人能帮忙吗?

至于问题1:您不必定义MyInt模块,您可以通过执行以下操作来缩短这一步骤:

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

我觉得你在重新发明轮子。看看Polka@pad:你对此有什么想法吗?谢谢你,我不用波尔卡。我在这里提到它是因为它的模块签名完全符合您的要求。实际上我刚刚了解到矩阵模块在波尔卡已经不存在了……真的吗?你从哪里得到的信息?