定义一个数字多态模块

时间:2012-01-28 14:18:49

标签: module ocaml

我想定义一个可以支持intint64float的模块。例如,

module Matrix =
  struct
    type 'a t = 'a array array

    (* add point-wise 2 matrices with same dimension *)
    let add (m: 'a t) (n: 'a t): 'a t =
      ...
  end

add的实施需要运营商plus+int+.floatInt64.add } int64。所以我不能写任何一个,否则,Matrix的类型不再是多态的。

有人能告诉我你是如何解决这个问题的吗?

我目前的一个想法是让Matrix成为一个仿函数:

module type NUM_TYPE =
  sig
    type t
    val add: t -> t -> t
  end

module Matrix =
  functor (Elt: NUM_TYPE) 
    struct
      type element = Elt.t
      type t = element array array

      (* add point-wise 2 matrices with same dimension *)
      let add (m: t) (n: t): t =
      ...
  end

然后我必须定义以下数值模块:

module MyInt =
  (struct 
     type t = int 
     let add (a: t) (b: t): t = a + b
  end: NUM_TYPE)       

module MyFloat = ...
module MyInt64 = ...

module MatInt = Matrix(MyInt)
module MatFloat = Matrix(MyFloat)
module MatInt64 = Matrix(MyInt64)

通过这种方法,我发现定义MyIntMyFloatMyInt64,特别是他们自己的add函数非常繁琐。有没有人有任何改进的想法?

2 个答案:

答案 0 :(得分:2)

您可以像这样在一行中写下每一行:

module MatInt = Matrix(struct type t = int let add = (+) end)

答案 1 :(得分:1)

我认为你不能在OCaml中做得更好(看看这篇博文:https://ocaml.janestreet.com/?q=node/37)。这将是一个非常好用的类型类。如果您对使用语言扩展感到满意,可以查看此项目:https://github.com/jaked/deriving