2009-07-25 3 views
1
 
mySequence 
|> Seq.iteri (fun i x -> ...) 
... 

Comment lier i à la fin de la séquence? En d'autres termes, comment lier la valeur représentant le nombre d'itérations itéré par iteri?Comment lier i à la fin d'une séquence en utilisant Seq.iteri

Bien sûr, je pourrais créer un ref et assigner je pour toutes les itérations, mais je me demande s'il y a une manière plus élégante?

Répondre

4

Vous pouvez utiliser fois, de sorte que

Seq.iteri (fun i x -> ...) 

devient

Seq.fold (fun i x -> ... ; i+1) 0 

le long de ces lignes:

let aSeq = 
    seq { 
     for i in 1..10 do 
      printfn "eval %d" i 
      yield i 
    } 

let r = 
    aSeq 
    |> Seq.fold (fun i x -> 
     printfn "iter %d" x // or whatever is "..." 
     i+1) 0  

printfn "result: %d" r 
+0

Pour moi Folds sont l'un des idiomes fonctionnels qui a vraiment changé ma façon d'aborder la résolution des problèmes . Vous devriez passer du temps avec eux si vous pouvez Moonlight. – gradbot

+0

Merci gradbot, j'apprécie les encouragements! – Moonlight

0

Comme je comprends que vous pouvez simplement utiliser la fonction qui va directement retourne la longueur de la séquence qui est passée à S eq.iteri (puisque Seq.iteri va itérer sur toute la séquence). Ce sera ainsi de programmation plus fonctionnelle au lieu de penser à des variables mutables:

Seq.length mySequence 

Dans votre cas:

mySequence |> Seq.iteri (fun i x -> ...) 
let i = Seq.length mySequence 
Questions connexes