2017-02-20 4 views
5

Ich habe einen sequenziellen Prozess mit einer optionalen Austrittsbedingung. Eine Möglichkeit, die Algorithmen zu schreiben ist wie diesRein funktioneller Weg aus einer Sequenz Schleife zu brechen

let mutable more = true 
for slot = startSlot to endSlot do 
    if more then 
     more <- process() 

Der Aufwand für die Überprüfung more für Slots, die aufgrund übersprungen werden ein Ausgang ist unerheblich. Dennoch scheint es eine elegantere Art zu geben, dies auszudrücken.

Antwort

9

Rekursion üblich ist hier:

let rec loop slot = if slot <= endSlot && process() then loop (slot + 1) 
loop startSlot 

Der Compiler reduzieren dies zu einer einfachen Schleife (keine tatsächlichen Rekursion stattfindet).

+2

+1: Schwanz-Rekursion ist so, wie es in F # zu tun, und es bedeutet auch, oft können Sie änderbare Variablen vermeiden was zu mehr idiomatischem Code führt. – FuleSnabel

4

Eine Möglichkeit, dies zu tun wäre, Seq.takeWhile

seq{startSlot .. endSlot} 
|> Seq.takeWhile (fun _ -> process()) 
|> Seq.iter ignore 

zu verwenden Dieser beendet die Schleife, wenn process() kehrt false

+2

'Seq' ist faul; Dies wird nichts tun, es sei denn, die Sequenz wird tatsächlich iteriert. – ildjarn

+0

Hoppla, du hast recht, bearbeiten die Antwort – klasske

+2

auch 'seq' sehr langsam im Vergleich zu Endrekursion/für – FuleSnabel

Verwandte Themen