В этом SO post, добавивПочему повторяющаяся ранее последовательность чтения запускает новое чтение?
inSeq
|> Seq.length
|> printfn "%d lines read"
вызвал ленивую последовательность в inSeq следует читать.
КИ, я расширил этот код и хочу первый распечатать эту последовательность (см новых ниже).
Когда Visual Studio (2012) отладчик получает
inSeq |> Seq.iter (fun x -> printfn "%A" x)
процесс чтения начинается снова. Когда я рассматриваю inSeq
с использованием отладчика, inSeq
, похоже, не содержит в нем элементов.
Если у меня есть первые прочитанные элементы в inSeq
, как я могу просмотреть эти элементы и почему они не распечатываются с вызовом Seq.iter
?
open System
open System.Collections.Generic
open System.Text
open System.IO
#nowarn "40"
let rec readlines() =
seq {
let line = Console.ReadLine()
if not (line.Equals("")) then
yield line
yield! readlines()
}
[<EntryPoint>]
let main argv =
let inSeq = readlines()
inSeq
|> Seq.length
|> printfn "%d lines read"
inSeq |> Seq.iter (fun x -> printfn "%A" x)
// This will keep it alive enough to read your output
Console.ReadKey() |> ignore
0
Я где-то читал, что результаты ленивой оценки не кэшируются. Это то, что здесь происходит? Как кешировать результаты?
['Seq.cache'] (https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/seq.cache%5B't%5D-function-%5Bfsharp%5D)? –
Где я буду использовать это и почему? – octopusgrabbus
'let inSeq = readlines() |> Seq.cache' –