2017-02-24 18 views
-1

Ich möchte einige Code in C in Ocaml geschrieben ändernOcaml Syntaxfehler in einem einfachen if-then-else

Hier ist ein C-Code

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

und ich versuchte es in Ocaml zu ändern, aber Irgendwie hatte ich einen Syntaxfehler in der zweiten Zeile.

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 

Was ist das Problem und wie kann ich es beheben?

+3

Das Problem ist in 'sei a = n in ; ', nicht' if'. – melpomene

Antwort

7

Sie müssen verstehen, dass Deklarationen lokal sind. Das heißt, wenn Sie schreiben let variable = assignment in expression, variable nur im Rahmen von expression

Jetzt gebunden ist, wenn Sie begin let a = n in; let b = m in end schreiben, nicht nur Ihre Variable nicht außerhalb des Blocks gebunden sein, aber der Compiler wartet immer noch auf einen Ausdruck nach beiden in Worten. Sie müssen sich daran erinnern, dass ; nicht etwas ist, das Sie jemals schreiben sollten, um nachfolgende Berechnungen anzuzeigen, es sei denn, Sie verwenden imperative Funktionen von OCaml.

Beachten Sie auch, dass jede let Erklärung eine neue Variable erstellen wird, also wenn Sie let a= an zwei verschiedenen Stellen des Codes eingeben, dies ist nicht das gleiche ein. Daher muss die let sein Außen auf Ihre if Aussage:

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

"es sei denn, Sie verwenden imperative Funktionen von OCaml,; ist nichts, was Sie jemals schreiben sollten." Außer in Listenliteralen und Datensätzen. :-) – sepp2k

+0

@ sepp2k in der Tat :-) – PatJ

1

Wenn Sie wan't, können Sie ganz das Gleiche tun:

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;;