2011-09-27 33 views
-1

爲什麼代碼OCaml的:應用到的參數太多

if some_bool_var then 
begin 
    output_string some_file "some string"; (* <--- error here *) 
end 

產生「應用到太多的參數」的錯誤。但如果我將其更改爲

if some_bool_var then output_string some_file "some string"; 

它編譯得很好。

這是爲什麼? 謝謝。

回答

2

我很懷疑你提交的內容沒有編譯。我將它複製到頂層,果然我沒有收到任何錯誤。

問題很可能不是您輸入的內容,而是您輸入內容後的內容。我猜你對這個特定的函數有更多的代碼行,因此end在表示該命令結束後應該有一個分號。將begin ... end視爲(...)...;的替代方案,作爲let() = ... in的替代方案。因此,使用begin ... end不能代替使用分號。

此外,結束您的output_string呼叫beginend之間的分號是不必要的,因爲該塊不會繼續執行更多命令。

+0

是的,我的代碼是在很多行內,這個「分號魔術」讓我有時會想。在我回答問題時,我遇到了另一個DID與「開始/結束」一起工作的問題,然後我將其更改爲「(...)」,並且它也起作用。但是當我回到前一個單行'if'錯誤的範圍時,'(...)'括號對我沒有幫助。但是當我把'''改成'');' - 它工作。這一切都很奇怪。有時我需要品嚐幾種組合才能編譯項目。無論如何,這是工作的解決方案。謝謝! – Slav

+0

這其實並不奇怪。當你將自己的頭腦融入語言設計師所建立的典範時,這種做法很自然。請記住,所有事情都會返回一個類型(在你的'單元'中)並且需要處理。 – nlucaroni