2010-11-30 8 views
6

haben ich ein Programm in ocaml einige Schleifen „für“ enthält das Schreiben, ist mein Problem für jeden dieser Zyklen, dass diese Meldung angezeigt: „Warnung 10: dieser Ausdruck sollte Typ haben Einheit. "Warnung 10: dieser Ausdruck sollte Typ Einheit

Beispiel:

let f q p rho= 

     let x = [] in 
     if q > p then 
      for i=0 to rho do 
       x= q :: x 
      done;  
    x;; 

jedes Mal, wenn ich einen Zyklus verwenden diese "für", wie kann ich dieses Problem lösen?

Antwort

8

Es gibt mehrere Probleme mit Ihrem Code.

Der Fehler ist, weil die for nichts zurückgibt, und so das Innere der Schleife rein für Nebenwirkung sein. Also sollte es Einheitentyp haben. Ihre Nutzung von = nicht Einheitentyp, weil = in der Tat ist der Gleichheitsoperator, zwei Werte zu vergleichen und true oder false zurück.

So werden Sie den falschen Operator. Anscheinend versuchen Sie, "x" zuzuweisen. Aber in ML können Sie "Variablen" nicht zuweisen, weil sie an einen Wert gebunden sind, wenn sie definiert sind und nicht ändern können. Eine Möglichkeit, Mutabilität zu erhalten, besteht darin, eine veränderbare Zelle ("Referenz") zu verwenden: Sie verwenden die Funktion ref, um die veränderbare Zelle aus einem Anfangswert zu erstellen. der Operator !, um seinen Wert herauszubekommen; und der Operator :=, um den Wert im Inneren zu ändern.

So zum Beispiel:

let f q p rho= 

    let x = ref [] in 
    if q > p then 
     for i=0 to rho do 
      x := q :: !x 
     done;  
    !x;; 
+0

Dank für Ihre antworte, zieh dein Beispiel an und füge "!" : x: = q ::! x – kafka

+0

@Antonio: danke – newacct

3

Diese Art von Schleife ist wahrscheinlich am besten ausgedrückt Rekursion:

let f q p rho= 
    let rec loop i = 
    if i > rho then 
     [] 
    else 
     q::(loop (i+1)) 
    in 
    if q > p then 
     loop 0 
    else 
     [];; 

Oder wir können es Schwanz rekursiv machen:

let f q p rho= 
    let rec loop i acc = 
    if i > rho then 
     acc 
    else 
     loop (i+1) (q::acc) 
    in 
    if q > p then 
     loop 0 [] 
    else 
     [];; 
Verwandte Themen