Я хотел бы лениво сгруппировать очень большую последовательность, используя следующий код:
// native F# version
let groups =
Seq.initInfinite id
|> Seq.groupBy (fun i -> i % 10)
for (i, group) in groups |> Seq.take 5 do
printfn "%A: %A" i (group |> Seq.take 5)
Ожидаемый результат:
1: seq [1; 11; 21; 31; ...]
2: seq [2; 12; 22; 32; ...]
3: seq [3; 13; 23; 33; ...]
4: seq [4; 14; 24; 34; ...]
5: seq [5; 15; 25; 35; ...]
Однако на практике эта программа зацикливается бесконечно, ничего не печатая. Возможно ли это сделать на F #?
Я бы хотел использовать Linq вместо собственных функций, но и GroupBy, и ToLookup производят такое же поведение (даже несмотря на то, что Linq GroupBy должен быть ленивым):
// Linq version
let groups =
Enumerable.GroupBy(
Seq.initInfinite id,
(fun i -> i % 10))
for group in groups |> Seq.take 5 do
printfn "%A" (group |> Seq.take 5)
Возможно, я делаю что-то непреднамеренно, что вызывает нетерпеливую оценку?