In dieser SO post, das HinzufügenWarum löst das Iterieren einer zuvor eingelesenen Sequenz einen neuen Lesevorgang aus?
inSeq
|> Seq.length
|> printfn "%d lines read"
die faule Sequenz in inSeq verursacht in gelesen werden.
OK, ich habe auf diesem Code erweitert und will zunächst aus dieser Sequenz drucken (siehe neu Programm unten).
Wenn das Visual Studio (2012) Debugger bekommt zu
inSeq |> Seq.iter (fun x -> printfn "%A" x)
der Lesevorgang beginnt von neuem. Wenn ich inSeq
mit dem Debugger untersuche, scheint inSeq
keine Elemente darin zu haben.
Wenn ich zuerst Elemente in inSeq
gelesen habe, wie kann ich diese Elemente sehen (untersuchen) und warum werden sie nicht mit dem Aufruf Seq.iter
ausgedruckt?
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
Ich habe irgendwo gelesen, dass Ergebnisse der faulen Bewertung nicht zwischengespeichert werden. Geht das hier? Wie kann ich die Ergebnisse zwischenspeichern?
['Seq.cache'] (https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/seq.cache%5B't%5D-funktion-%5Bfsharp%5D)? –
Wo werde ich das verwenden und warum? – octopusgrabbus
'let inSeq = readlines() |> Seq.cache' –