我有一个Ring的模块签名.IntRing(Z)很容易定义,但我想创建IntRingModP(Z_p).如何在创建模块时将P传递给仿函数来设置它?
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;;
Run Code Online (Sandbox Code Playgroud)
这导致了 File "polynomials.ml", line 25, characters 24-27:
Error: Unbound module type Int
函数只能将模块作为参数.因此,您需要创建一个包装的新模块类型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;;
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
在将模块作为参数传递给函子之前,您需要指定其签名。您指的是模块类型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
Run Code Online (Sandbox Code Playgroud)
要实例化它,您需要提供值:
module Int2 = IntRingModP(struct let modulus = 2 end)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |