2012-05-24 4 views
5

Pythonのenumerate()のように機能するF#シーケンスを列挙する標準関数はありますか?シーケンスの自動列挙

それは一から書くのは非常に簡単です:

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 
    } 

が、私は車輪の再発明する必要はありません。

PSは:また、私は

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

またはホット「N FSharpxとスパイシー:

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

まあ、実際には、FSharpxで、それはすでにですSeq.indexとして入手できます。

関連する問題