2016-04-28 67 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