2012-05-24 15 views
5

¿Existe una función estándar para enumerar una secuencia F # que funcione como la enumerate() de Python?Enumeración automática de una secuencia

Es muy fácil escribir desde cero:

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 
    } 

pero no quiero reinventar la rueda.

PS: También, he intentado

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

pero esta parte [0..10000] ve feo.

Respuesta

1

Esto es lo que quiere:

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 picante con FSharpx:

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

Bueno, en realidad, en FSharpx ya está disponible como Seq.index.

Cuestiones relacionadas