我可以在Ocaml中将值传递给函子吗?
我有一个戒指的模块签名。IntRing(Z)很容易定义,但我想创建IntRingModP(Z_p)。创建模块时,如何将P传递给函子以设置它我可以在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
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
是它的类型。谢谢,我会试试这个!