2012-01-28 71 views
2

我想定義一個模塊,它可以支持int,int64float。例如,定義一個數字多態模塊

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.addint64。所以我不能寫出其中的任何一個,否則,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,MyFloatMyInt64,特別是他們自己的add函數。有沒有人有任何想法來改善這一點?

回答

2

你可以寫的每一條線是這樣的:

module MatInt = Matrix(struct type t = int let add = (+) end) 
相關問題