2017-02-20 1 views
5

J'ai un processus séquentiel avec une condition de sortie optionnelle. Une façon d'écrire les algorithmes est comme ceMéthode fonctionnelle propre pour sortir d'une boucle de séquence

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

Les frais généraux de la vérification more pour les emplacements qui ne sont pas pris en raison d'une sortie est insignifiante. Pourtant, il semble qu'il devrait y avoir une façon plus élégante d'exprimer cela.

Répondre

9

récursivité est habituel ici:

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

Le compilateur réduira ceci à une boucle simple (pas réelle récursion a lieu).

+2

+1: Tail-récursion est la façon de le faire en F # et cela signifie souvent que vous pouvez éviter les variables mutables conduisant à plus de code idiomatique. – FuleSnabel

4

Une façon de le faire serait d'utiliser Seq.takeWhile

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

Cela sortir de la boucle lors process() retours false

+2

'Seq' est paresseux; cela ne fera rien à moins que la séquence ne soit réellement itérée. – ildjarn

+0

Oups, vous avez raison, édité la réponse – klasske

+2

Aussi 'seq' est très lent par rapport à la récursion de queue/pour – FuleSnabel