2017-02-24 67 views
-1

我想換用C語言編寫一些代碼爲ocaml的ocaml的語法錯誤,一個簡單的if-then-else的

這裏是一個C代碼

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

,我試圖把它變成ocaml的,但不知何故,我在第二行得到了語法錯誤。

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

的問題是在'讓A = N在;',而不是'如果'。 – melpomene

回答

7

你必須明白,讓聲明是本地的。也就是說,當你寫let variable = assignment in expressionvariable只在expression

範圍,當你寫begin let a = n in; let b = m in end,不僅是你的變量將不是塊的外部約束約束現在,但是編譯器仍然在等待一個表達式之後都有in的字樣。你必須記住,除非你使用OCaml的命令式功能,否則;是不應該寫來表示後續計算的。

還要注意每一個let聲明將創建一個新的變量,因此,如果您在代碼中的兩個不同的地方,這是不一樣的一個鍵入let a=。因此,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;;