在OCaml中定义矩阵模块

时间:2012-01-14 17:59:43

标签: module matrix ocaml

我想构建一个通用矩阵模块,它包括诸如length,width,size,read_element,write_element等常规操作。因为矩阵可以用几种类型定义:element array array,{{1或者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

我的问题是:

1)我必须首先定义一个模块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 ,然后将其放入仿函数中以创建MyInt ...我发现它是多余的......有没有办法直接实例化矩阵其元素的类型为MatInt的模块?

2)考虑到int中的内容,有没有办法实现矩阵模块,以便它同时处理矩阵类型的不同可能性?也许是模式匹配?

希望我的问题清楚,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

关于问题#1:您不必定义MyInt模块,您可以通过以下方式删除该步骤:

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