2016-04-28 10 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 = ....」という私の考えは、whileループが終了したときに残りのプログラムで使用できるようにgを更新し続けることでした。私は 'done in'とリンクしたいと思っています。もし私がそれをできないのであれば、どうすればこの問題を解決できますか?私は前に 'done in'を見たと思うけど、今度はforループであって、whileループではないと思います。 –

+0

@ power_output 'done 'と表示される唯一の方法は、ループが' let'式の値として使用された場合です。つまり、 'let something = while cond do ... done in'です。とにかく、 'let'は新しい変数を作成します。既存の変数の値には影響しません。あなたが何かを再割り当てできるようにするには、 'ref'(または変更可能なメンバーを持つもの)が必要です。 – sepp2k

関連する問題