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

Как связать i в конце последовательности? Другими словами, как мне привязать значение, представляющее число итераций, итераций iteri?Как связать i в конце последовательности с использованием Seq.iteri

Конечно, я мог бы создать ref и назначить i для всех итераций, но мне интересно, есть ли более элегантный способ?

ответ

4

Вы можете использовать раз, так что

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

становится

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

вдоль этих линий:

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

Для меня сгибы один из функциональных идиом, которые действительно изменили способ Подхожу решения проблем , Вы должны провести с ними некоторое время, если сможете Moonlight. – gradbot

+0

Спасибо, градбот, я ценю поддержку! – Moonlight

0

Как я понимаю, вы могли бы просто использовать функцию, которая будет непосредственно возвращаемая длина последовательности, которая передается S eq.iteri (поскольку Seq.iteri будет перебирать всю последовательность). Это будет более функциональный способ программирования вместо того, чтобы думать о изменяемых переменных:

Seq.length mySequence 

В вашем случае:

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