2015-06-30 75 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) 
相关问题