2012-01-16 49 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 

最新的是短,因爲你沒有指示類型的信息做,但更容易出錯因爲在部分應用程序的情況下,編譯器不會讓你感到溫暖。

相關問題