2012-10-28 79 views
2

我正在第一次學習OCaml,而且我遇到了一個非常模糊的「語法錯誤」,有點麻煩。 當定義函數generateboxes像這樣:OCaml「else」語法錯誤

let rec generateboxes a b = 
    if a = (add1 b) then (force_newline()); (print_sting "Done!") 
    else if [1] = (Array.get finalarray a) then (populatebox 
    (numbertoposition a) a); (generateboxes (add1 a) b) 
    else (generateboxes (add1 a) b);; 

的編譯提供錯誤消息:「語法錯誤」,並指向第一個else。我的代碼有什麼明顯的錯誤來輸出這樣的消息嗎? (我意識到代碼不在上下文中,但如果它的語法錯誤,那麼它應該沒關係)。

+2

我建議你把每個不超過一個「東西」並使用執行自動縮進的文本編輯器。具有caml模式,tuareg模式或typerex的Emacs非常適合這一點。您只需按一次Tab鍵即可正確縮進當前行。那會馬上解釋你的語法錯誤。 –

回答

6
let rec generateboxes a b = 
    if a = add1 b then (force_newline(); print_sting "Done!") 
    else if [1] = Array.get finalarray a then 
     (populatebox (numbertoposition a) a; generateboxes (add1 a) b) 
    else generateboxes (add1 a) b;; 

如果你有一個then多個語句或else條款,你需要把它們放在括號內。 或者,你可以把begin ... end他們身邊:

let rec generateboxes a b = 
    if a = add1 b 
    then begin 
     force_newline(); 
     print_sting "Done!" end 
    else if [1] = Array.get finalarray a 
    then begin 
     populatebox (numbertoposition a) a; 
     generateboxes (add1 a) b end 
    else generateboxes (add1 a) b;; 

(請注意,我也去掉了幾個不必要的括號,使代碼更清晰。)

+0

非常感謝你,我之前從未使用過begin..end表達式,所以它會花費我很長時間才能弄清楚! – Balthasar

+0

我傾向於更喜歡括號(因爲它們更輕,所以使用與C或Java中的花括號相同的方式),但這是一個品味問題。 – jrouquie

+0

我這樣做的方式是在括號旁邊加上括號:'if ... then(\ n .... \ n)else ...' – lukstafi