2012-05-24 9 views
5

Esiste una funzione standard per enumerare una sequenza F # che funzioni come enumerate() di Python?Enumerazione automatica di una sequenza

E 'molto facile scrivere da zero:

let enumerate (sq : seq<'T>) = seq { 
    let rec loop (e : IEnumerator<'T>) index = seq { 
     if e.MoveNext() then 
      yield (index, e.Current) 
      yield! loop e (index+1) 
    } 

    use enum = sq.GetEnumerator() 
    yield! loop enum 0 
    } 

ma non voglio reinventare la ruota.

PS: Inoltre, ho provato

let seasons = ["Spring"; "Summer"; "Fall"; "Winter"] 
for x in Seq.zip [0..100000] seasons do 
    printfn "%A" x 

ma questa parte [0..10000] sembra brutto.

risposta

1

Questo è ciò che si vuole:

module Seq = 
    let inline enumerate source = Seq.mapi (fun i x -> i,x) source 

> ["a"; "b"] |> Seq.enumerate;; 
val it : seq<int * string> = seq [(0, "a"); (1, "b")] 

O Hot 'n piccante con FSharpx:

let enumerate source = Seq.mapi (curry id) source 

Beh, in realtà, in FSharpx è già disponibile come Seq.index.