2012-01-16 80 views
1

我已经在一个文件中定义mod.ml模块如下:定义模块,并调用其功能在一个文件中

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

Print.printf "hehe";; 

Area.test 

似乎没有;;end后,我不能ocamlc编译代码。但是在Ocaml文件中有;;,这让我感到很奇怪,我必须保留它们吗?

生成modocamlc后,我启动mod,它打印hahahehe。看来haha是由let test : unit ...的定义而不是其呼叫Area.test打印的。结果除了hehehahahahahehehaha。任何人都可以解释为什么它不是我所期望的?

回答

4

我从来没有在我的源文件中使用;;,我认为它是顶级界面的一部分。为了您的代码,我可能会写:

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

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

对于它的价值,如Area.test你定义它是不是一个函数,它只是与它的计算过程中的副作用的单位值。在我的代码中,我将其更改为unit -> unit类型的函数。

4

ocamlc加载模块时,它会按照定义的顺序评估所有“顶层”定义。就你而言,你有三个“顶层”定义。

  • 第一个是值unit,其被结合到名称“测试”(类型unit的唯一值)。这个值是在一个副作用后产生的:显示“哈哈”(这里模块Area作为一个名字空间,它不会延迟计算);

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

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

如果你想在每次调用测试时间的副作用,你需要使用的功能:

let test() = Print.printf "haha" 

而对于你的问题的;;一部分。解析器需要这些才能知道表达式何时结束。还有其他的方法来帮助解析器,例如:

let() = Print.printf "hehe" 

或者干脆:

let _ = Area.test 

最新的是短,因为你没有指示类型的信息做,但更容易出错因为在部分应用程序的情况下,编译器不会让你感到温暖。

相关问题