2012-05-24 13 views
5

क्या कोई F # अनुक्रम गणना करने के लिए मानक फ़ंक्शन है जो पाइथन के enumerate() जैसे काम करता है?अनुक्रम का स्वचालित गणना

यह खरोंच से लिखने के लिए बहुत आसान है:

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 
    } 

लेकिन मैं पहिया बदलने की नहीं करना चाहती।

पुनश्च: भी, मैं

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

की कोशिश की लेकिन इस [0..10000] हिस्सा बदसूरत लग रहा है।

उत्तर

1

यह तुम क्या चाहते है:

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")] 

या गर्म 'एन मसालेदार FSharpx साथ:

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

ठीक है, वास्तव में, FSharpx में यह पहले से ही है Seq.index के रूप में उपलब्ध है।