在课堂上打开OCaml模块

时间:2015-06-09 01:05:14

标签: ocaml

我有一个Map模块,我希望它在一个类的范围内。如何在整个班级中打开该模块?

这是我的猜测,但这是错误的:

module My_map = struct
    module Map = ...
end

class my_object =
    object
        open My_map.Map

        method ...
    end

但这不起作用。有没有办法在类级别而不是在每个方法中打开模块?

具体来说,我遇到的问题是:

module Data = My_map.Map.Make(String)

然而,当我尝试访问我添加到My_map.Map.Make的函数(在类中)时,我收到编译器错误,说它们不存在。

2 个答案:

答案 0 :(得分:2)

我刚刚查看了OCaml语法,但我没有看到一个地方为整个类定义打开一个模块。

您可以说

之类的内容
class c =
    let x = 4 in
    object method m = x end

因此可以说:

class c =
    let open My_map.Map in
    object method m = ... end

然而语法不允许。

您可以在全局范围内打开该模块,也可以为其提供一个简短的同义词,以便输入您的类定义。

module M = My_map.Map

<强>更新

重读您的问题,我无法摆脱您认为您需要打开模块以使用其符号的感觉。事实并非如此,打开模块只是为了方便。通过使用完整的模块路径,也可以在不打开模块的情况下访问通过打开模块可以访问的任何符号。事实上,许多人(包括我自己)会告诉你除了极少数情况外,不要打开模块。

如果您只是在指定正确的模块路径时遇到问题,那么如果您可以提供演示此问题的自包含(小型)代码,则会有很大帮助。

答案 1 :(得分:2)

我认为你不能在类定义中打开你的模块。 但是,您可以在函数中“打开”它:

module My_map = struct
  module Map = (struct
    type t = int

    let f () : t = 3

  end)
end

class my_object =
  object
      method stuff = My_map.Map.(
        let x = f () in
        x + f ()
      ) 
  end

这样,您就可以使用f两次,而无需两次编写My_map.Map

关于问题的第二部分,正如Jeffrey Scofield所指出的那样,我不确定它是否与打开模块有关。 或许你想要(在我的例子中),f成为my_object的方法?

我也认为不可能,我认为没有任何理由。 也许,你想要的是继承?