2017-02-24 5 views
-1

私はOCamlのシンプルでOCamlの構文エラーにされたif-then-else

にCで書かれたいくつかのコードを変更したい

ここでは、Cコード

int a, b; 
if(m > n) 
{ 
    a = n; 
    b = m; 
} 
else 
{ 
    a = m; 
    b = n; 
} 

であり、私はOCamlの中にそれを変更しようとしたが、何とか2行目に構文エラーがあります。

let rec gcd m n = 
if m > n then begin let a = n in; let b = m in end 
else begin let a = m in; let b = n in end 

どのような問題がありますか?どのように修正できますか?

+3

問題が聞かせて= Nで 'であります; 'ではなく' if'です。 – melpomene

答えて

7

宣言はローカルであることを理解する必要があります。あなたがlet variable = assignment in expressionを書くときには、variableであることだけがbegin let a = n in; let b = m in endを書くとき今、あなたの変数だけではなく、ブロックの外に束縛されることはありませんが、コンパイラはまだ表現を待っているexpression

の範囲にバインドされています両方の後にin単語。 OCamlの命令的な機能を使用していない限り、;は後の計算を示すために書くべきではありません。あなたのコードの2つの異なる場所、これは同じないでlet a=を入力するので、もし、すべてのlet宣言は、新しい変数を作成することも

注意。したがって、letはあなたのifステートメントに外装でなければなりません:

let (a,b) = 
if m > n 
then (n,m) 
else (m,n) 
in 
the rest of your code 
+1

"あなたがOCamlの命令的な機能を使用していない限り、これはあなたが書いたはずのものではありません。リストのリテラルとレコードを除きます。 :-) – sepp2k

+0

@ sepp2k確かに:-) – PatJ

1

あなたはwan't場合は、全く同じ操作を行うことができます。

let m=3 and n=4 in 

let a=ref 0 and b=ref 0 in 
if(m > n) 
then 
(
    a:=n; 
    b:=m; 
) 
else 
(
    a:=m; 
    b:=n; 
); 

Printf.printf "a=%d b=%d\n" !a !b;; 
関連する問題