2016-07-03 14 views
1

出力をファイルに書き込むことができる単純な関数、たとえばfile.txtを作成しようとしています。出力は乗算表です(下記参照)。九九のOCamlを使って単純な乗算表を出力する

例関数の引数が5である場合: Example of the multiplication table if the function argument is 5

問題は、私は、コード実行時にOCamlはちょうどハングということです(おそらく無限再帰のか?)。

let rec table file x = 
    let ch = open_out file in 
     row ch x 1; 
     close_out ch;; 

私はtable "foo" 5を実行すると、それだけでハングアップ:

(*n is the row counter and n2 is the column counter*) 
let rec row ch x n = 
    let rec column ch x n n2 = 
     (*If column counter reaches limit then stop here*) 
     if (n2 = x+1) 
     then() 
     else 
      output_string ch (string_of_int (n2*n)); 
      output_char ch '\t'; 
      column ch x n (n2+1) 
    in 
     column ch x n 1; 

     (*If row counter reaches limit then stop here*) 
     if n = x+1 
     then() 
     else 
      output_char ch '\n'; 
      row ch x (n+1);; 

後、私は次のように表関数の行を呼び出す..私はロジックを見続けると、それは大丈夫そうです。また、今後、どうすればこのようなエラーをよりうまく処理できますか? OCamlの推奨デバッグオプションは?

答えて

3

同じ問題の2つのケースがあります。else部分のif/then/elseは1つの式を制御しますが、いくつかの式を制御することを期待しています。

最初のケースでは、elseは単にoutput_stringを制御しています。これは、すべての場合にcolumn関数の残りの部分が実行されることを意味します。実際、これは無限の再帰です。

elseは、output_charを制御します。繰り返しますが、これは無限回帰を与えます。

あなたはここにbegin/endを追加することによってこの問題を解決することができます

begin 
output_string ch (string_of_int (n2*n)); 
output_char ch '\t'; 
column ch x n (n2+1) 
end 

そしてここに:

begin 
output_char ch '\n'; row ch x (n+1) 
end 

私はこれらの変更を行った後、コードは私のために動作します。

+0

返信いただきありがとうございます!私のために働いた。セミコロン演算子のために、その直後の印刷式だけを制御しますか? (私が正しく覚えているなら、演算子は左に式を投げ捨てます) –

+0

はい、それを見る別の方法は 'then'と' else'が ';'より高い優先順位を持つことです。 'begin/end'を必要としない他の方法で複数の式を組み合わせることができます。 –

関連する問題