Module 定义一个模块并在一个文件中调用其函数

Module 定义一个模块并在一个文件中调用其函数,module,ocaml,Module,Ocaml,我在文件mod.ml中定义了一个模块,如下所示: module Area = struct ... let test : unit = Print.printf "haha" ... end;; Print.printf "hehe";; Area.test 似乎没有在end之后,我无法通过ocamlc编译代码。但是对我来说,有在Ocaml文件中,我必须保留它们吗 通过ocamlc生成mod后,我启动mod,它将打印hahahehe。似乎haha是由let test:u

我在文件
mod.ml
中定义了一个模块,如下所示:

module Area = struct
  ...
  let test : unit =
    Print.printf "haha"
  ...
end;;

Print.printf "hehe";;

Area.test
似乎没有
end
之后,我无法通过
ocamlc
编译代码。但是对我来说,有
在Ocaml文件中,我必须保留它们吗


通过
ocamlc
生成
mod
后,我启动
mod
,它将打印
hahahehe
。似乎
haha
是由
let test:unit…
的定义打印出来的,而不是它的调用
区域。test
。因此,我所做的是
哈哈哈
哈哈哈
。有人能解释为什么它不是我所期望的吗?

我从不使用

module Area = struct
  let test : unit -> unit =
      fun () -> Printf.printf "haha"
end

let () =
    Printf.printf "hehe";
    Area.test ()

值得一提的是,
Area.test
正如您定义的那样,它不是一个函数,它只是一个单位值,在计算过程中会产生副作用。在我这里的代码中,我将其更改为类型为
unit->unit
的函数,我从不使用

module Area = struct
  let test : unit -> unit =
      fun () -> Printf.printf "haha"
end

let () =
    Printf.printf "hehe";
    Area.test ()

值得一提的是,
Area.test
正如您定义的那样,它不是一个函数,它只是一个单位值,在计算过程中会产生副作用。在这里的代码中,我将其更改为类型为
unit->unit

的函数当
ocamlc
加载模块时,它会按照定义的顺序计算所有“顶级”定义。在您的例子中,有三个“顶级”定义

  • 第一个是值
    unit
    (类型
    unit
    的唯一值),它绑定到名称“test”。这个值是在副作用后生成的:显示“哈哈”(这里模块
    区域
    用作名称空间,它不会延迟计算)

  • 第二个是值
    单位
    ,但没有名称绑定;该值也会产生副作用:显示“呵呵”

  • 最后一个是与名称“test”关联的值,即
    单元
    。但是,这一次没有副作用,因为已经生成了与名称“test”关联的值
    unit

如果希望每次调用test时都有副作用,则需要使用以下函数:

let test () =  Print.printf "haha"
对于
问题的一部分。解析器需要这些信息才能知道表达式何时结束。还有其他方法可以帮助解析器,例如:

let () = Print.printf "hehe"
或者简单地说:

let _ = Area.test

最新版本较短,因为您不必指示类型信息,但更容易出错,因为编译器在部分应用程序的情况下不会使您感到温暖。

ocamlc
加载模块时,它会按照定义的顺序计算所有“顶级”定义。在您的例子中,有三个“顶级”定义

  • 第一个是值
    unit
    (类型
    unit
    的唯一值),它绑定到名称“test”。这个值是在副作用后生成的:显示“哈哈”(这里模块
    区域
    用作名称空间,它不会延迟计算)

  • 第二个是值
    单位
    ,但没有名称绑定;该值也会产生副作用:显示“呵呵”

  • 最后一个是与名称“test”关联的值,即
    单元
    。但是,这一次没有副作用,因为已经生成了与名称“test”关联的值
    unit

如果希望每次调用test时都有副作用,则需要使用以下函数:

let test () =  Print.printf "haha"
对于
问题的一部分。解析器需要这些信息才能知道表达式何时结束。还有其他方法可以帮助解析器,例如:

let () = Print.printf "hehe"
或者简单地说:

let _ = Area.test
最新版本更短,因为您不必指示类型信息,但更容易出错,因为编译器在部分应用程序的情况下不会使您感到温暖