我想定义一个可以支持int
,int64
和float
的模块。例如,
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
,+.
为float
,Int64.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)
通过这种方法,我发现定义MyInt
,MyFloat
和MyInt64
,特别是他们自己的add
函数非常繁琐。有没有人有任何改进的想法?
答案 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。