Я хотел бы группа очень большая последовательность лениво используя код вроде следующего:Есть ли ленивая версия функции Fq's Seq.groupBy?
// 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 производят такое же поведение (даже если GroupBy Linq, как предполагается, быть ленивым):
// 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)
Возможно, я делаю что-то непреднамеренно, что вызывает нетерпеливую оценку?
Нет, это не вы, это реализация методов. Они не совсем ленивы - они не начнут оценивать, если вам не нужны результаты, но все результаты будут сгенерированы сразу же, что происходит. Но это потому, что такой сценарий, как ваш, необычен. – MarcinJuraszek
ОК, ну, это неутешительно. Благодарю. – brianberns