如何使用类声明将第一类模块解压缩到对象的模块?

时间:2014-07-31 13:26:04

标签: class object ocaml unpack

我有:

module type A = sig end

此代码有效:

let f x = 
  let module X = (val x : A) in
  object end

和此:

let f (module X : A) = 
  object end

但这是无效的:

class c x = 
  let module X = (val x : A) in
  (*              ^^^ Error: Syntax error *)
  object end

和此:

class c (module X : A) = 
(*       ^^^^^^^^^^^^^ Error: Modules are not allowed in this pattern. *)
  object end

我无法理解:为什么? 如何在类上下文中将第一类模块解包到模块中? 我的编译器版本= 4.01.0

谢谢

1 个答案:

答案 0 :(得分:6)

不允许使用任何形式的类定义的本地模块:

class c =
    let module L = List in
      object end;;
    Characters 18-24:
      let module L = List in
          ^^^^^^
Error: Syntax error

我不确定具体原因,但我认为它on very good authority很难实现。

但是,可以接受类的第一类模块参数,并在实际使用它的方法和值中解压缩它。例如:

class c d = object
  method foo =
    let module D = (val d : A) in
      D.b + 5
end