2015-06-30 73 views
3

我有一個環模塊簽名。 IntRing(Z)很容易定義,但我想創建IntRingModP(Z_p)。如何在創建模塊時將P傳遞​​給仿函數進行設置?我可以將值傳遞給Ocaml中的函數嗎?

module IntRing : Ring = struct 
    type t = int 
    let zero = 0 
    let one = 1 
    let add a b = a+b 
    let mult a b = a*b 
    let compare = compare 
    let equal a b = (a=b) 
    let to_string = Int.to_string 
    let print a = print_string (to_string a) 
end;; 

module IntRingModP (P : Int) : Ring = struct 
    let p = P 
    type t = int 
    let zero = 0 mod p 
    let one = 1 mod p 
    let add a b = (a+b) mod p 
    let mult a b = (a*b) mod p 
    let compare a b = compare (a mod p) (b mod p) 
    let equal a b = ((a mod p) = (b mod p)) 
    let to_string a = Int.to_string (a mod p) 
    let print a = print_string (to_string a) 
end;; 

這導致File "polynomials.ml", line 25, characters 24-27: Error: Unbound module type Int

+0

你的意思是這樣的? http://pastebin.com/uVGZxsD3(我不認爲我理解你的問題) –

+0

你指的是'Int',假設它是一個模塊,但它是一個模塊類型。模塊的名稱,在你的情況下是'P'。 'P'是一個形式參數,'Int'是它的類型。 – ivg

回答

5

函子只能有模塊作爲參數。因此,你需要它包裝int一個新的模塊類型:

module type IntT = sig 
    val x : int 
end;; 

module IntRingModP (P : IntT) : Ring = struct 
    let p = P.x 
    type t = int 
    let zero = 0 mod p 
    let one = 1 mod p 
    let add a b = (a+b) mod p 
    let mult a b = (a*b) mod p 
    let compare a b = compare (a mod p) (b mod p) 
    let equal a b = ((a mod p) = (b mod p)) 
    let to_string a = Int.to_string (a mod p) 
    let print a = print_string (to_string a) 
end;; 

希望有所幫助。

+0

謝謝,我會試試這個! –

3

在將模塊作爲參數傳遞給函子之前,您需要指定其簽名。您指的是Int模塊,但默認情況下OCaml中沒有定義這種模塊類型。你需要自己定義,像這樣:

module type Modulus = sig 
    val modulus : int 
end 

module IntRingModP (P : Modulus) : Ring = struct 
    let p = P.modulus 
    type t = int 
    let zero = 0 mod p 
    let one = 1 mod p 
    let add a b = (a+b) mod p 
    let mult a b = (a*b) mod p 
    let compare a b = compare (a mod p) (b mod p) 
    let equal a b = ((a mod p) = (b mod p)) 
    let to_string a = Int.to_string (a mod p) 
    let print a = print_string (to_string a) 
end 

並初始化它,你需要提供的價值:

module Int2 = IntRingModP(struct let modulus = 2 end) 
相關問題