2016-04-28 49 views
0

下面的代码有什么问题?我知道何时使用'',我挣扎了很多';'要么 ';;'或者在OCaml中使用begin end。在这里,我需要阅读一些边缘并插入到图形中,但我需要将其与程序的其余部分链接起来,以便它可以将g(图形)与所有边缘一起使用。 当我做到这一点,它说错误:语法错误在OCaml中循环时出现语法错误

let i = ref n in 
while !i > 0 do 
( 
    let pair = read_edge Scanning.stdin in 
    let g = insert_edge (fst pair) (snd pair) g in 
    i := !i - 1 
) 
done in (* giving error in this line *) 

let rec do_stuff l = 
    match l with 
    | [] ->() 
    | h::t -> print_int h;do_stuff t in 

(* more functions) 

回答

2

inlet语法(这是"let" pattern "in" expression)的一部分。 while循环的语法只是"while" expression "do" expression "done",所以在那里没有in

为了让你的代码能够编译,你可以用;代替in,所以它执行while循环后面跟着let表达式。然而,我觉得你在一堆函数定义之间有一个while循环似乎很奇怪。

另外请注意,在循环中你做let g = ...,但你没有在let的身体任何地方使用g。所以这个约束完成任何事情。

+0

实际上,';'只是'let()= '的语法糖,如果我没有弄错的话。 – RichouHunter

+0

我对'let g = ....'的想法是不断更新g,这样当while循环结束时它可以被程序的其余部分使用。我想把它与'完成'连接起来,如果我不能这样做,我该如何解决这个问题?我认为我之前看到'完成了',但现在我认为它是在for循环中,而不是在一个while循环中。 –

+0

@power_output如果循环被用作'let'表达式中的值,也就是'let something = while cond do ... done in ...',那么你会看到'done in'的唯一方法。无论如何,'let'会创建一个新变量 - 它不会影响现有变量的值(您不能这么做)。如果你想能够重新分配一些东西,你需要一个'ref'(或任何带有可变成员的东西)。 – sepp2k