我想定義一個模塊,它可以支持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
函數。有沒有人有任何想法來改善這一點?