我可以在Ocaml中将值传递给函子吗?

我可以在Ocaml中将值传递给函子吗?,ocaml,Ocaml,我有一个戒指的模块签名。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

我有一个戒指的模块签名。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;;
这将导致
文件“polynomials.ml”,第25行,字符24-27:

错误:未绑定的模块类型Int

functor只能将模块作为参数。因此,您需要创建一个新的模块类型,它包装
int

模块类型IntT=sig
val x:int
完;;;
模块IntRingModP(P:IntT):Ring=struct
设p=p.x
类型t=int
设0=0模p
设一=1模p
让我们加上a b=(a+b)mod p
设mult a b=(a*b)mod p
让我们比较a b=比较(a mod p)(b mod p)
设a等于b=((a mod p)=(b mod p))
let to_string a=Int.to_string(a mod p)
打印a=打印字符串(到字符串a)
完;;;

希望对您有所帮助。

在将模块作为参数传递给函子之前,您需要指定其签名。您指的是模块类型
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)

你是说像这样的事吗?(我不理解你的问题)你指的是
Int
,假设它是一个模块,但它是一个模块类型。在您的案例中,模块的名称是
P
P
是一个形式参数,
Int
是它的类型。谢谢,我会试试这个!