我可以将值传递给Ocaml中的仿函数吗?

Col*_*son 4 ocaml

我有一个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

Aad*_*hah 6

函数只能将模块作为参数.因此,您需要创建一个包装的新模块类型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)

希望有所帮助.


ivg*_*ivg 5

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