Автоматическое перечисление последовательности

Есть ли стандартная функция для перечисления последовательности F #, которая работает как enumerate () в Python?

С нуля написать очень просто:

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] часть выглядит некрасиво.


person qehgt    schedule 24.05.2012    source источник


Ответы (2)


Я думаю, может ты хочешь Seq.mapi или Seq.iteri.

http://msdn.microsoft.com/en-us/library/ee340431.aspx

http://msdn.microsoft.com/en-us/library/ee370541

person Brian    schedule 24.05.2012
comment
Спасибо. По крайней мере, Seq.mapi может делать то, что я хочу, как однострочный. - person qehgt; 24.05.2012

Вот чего вы хотите:

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

Или Hot 'n Spicy с FSharpx:

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

На самом деле, в FSharpx он уже доступен как Seq.index.

person johv    schedule 18.12.2013