2016-04-28 27 views
0

Was ist das Problem mit dem Code unten? Ich kämpfe sehr mit dem Wissen, wann ich ';' oder ';;' oder benutze begin ende in OCaml. Hier muss ich einige Kanten lesen und in Graphen einfügen, aber ich muss dies mit dem Rest des Programms verbinden, so dass es g (ein Graph) mit allen Kanten verwenden kann. Wenn ich dies tun, sagt sie Fehler: SyntaxfehlerSyntaxfehler while-Schleife in OCaml

let i = ref n in 
while !i > 0 do 
( 
    let pair = read_edge Scanning.stdin in 
    let g = insert_edge (fst pair) (snd pair) g in 
    i := !i - 1 
) 
done in (* giving error in this line *) 

let rec do_stuff l = 
    match l with 
    | [] ->() 
    | h::t -> print_int h;do_stuff t in 

(* more functions) 

Antwort

2

in Teil der Syntax von let ist (es ist "let" pattern "in" expression). Die Syntax einer while-Schleife ist einfach "while" expression "do" expression "done", also gibt es dort keine in.

Um Ihren Code kompilieren zu lassen, können Sie in durch einen ; ersetzen, so dass es die while-Schleife ausführt, gefolgt von dem Ausdruck let danach. Es erscheint mir jedoch merkwürdig, dass Sie eine While-Schleife zwischen einer Reihe von Funktionsdefinitionen haben.

Beachten Sie auch, dass in der Schleife Sie let g = ... tun, aber dann bist du nicht g überall in der let ‚s Körper verwendet wird. Diese Bindung bewirkt also nichts.

+0

Eigentlich ';' ist nur syntaktischer Zucker für 'let() = in' wenn ich mich nicht irre. – RichouHunter

+0

Meine Idee von 'let g = ....' war es, g so zu aktualisieren, dass es nach Beendigung der while-Schleife vom Rest des Programms benutzt werden kann. Ich wollte es mit 'done in' verbinden, wenn ich es nicht kann, wie kann ich das lösen? Ich glaube, ich habe 'vorher 'gesehen, aber jetzt, wo ich daran denke, war es in einer For-Schleife, nicht in einer While-Schleife. –

+0

@power_output Die einzige Möglichkeit, in der Sie "done" sehen würden, wäre, wenn die Schleife als Wert in einem 'let' Ausdruck verwendet würde, d. H.' Let etwas = while cond do ... done in ... '. Wie auch immer, 'let' erzeugt eine neue Variable - sie beeinflusst nicht den Wert einer existierenden Variablen (was Sie nicht tun können). Wenn du etwas neu zuweisen willst, brauchst du ein 'ref' (oder irgendwas mit einem veränderbaren Mitglied). – sepp2k