2017-02-24 46 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;;