2012-10-28 48 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