Ich bin neu in F # und ich codiere kleine Herausforderungen, um die wesentlichen Details über die Sprache zu lernen. Ich denke, ich habe ein Problem wegen Unveränderlichkeit.F # Unveränderlichkeit, reine Funktion und Nebeneffekt
Szenario: Ich muss Höhenzeilen in der Konsole lesen, jede Zeile enthält eine ganze Zahl. Diese ganze Zahl repräsentiert die Größe eines Berges. Nach dem Lesen der Eingabe muss ich die Zeilennummer der höchsten Berge schreiben. Wenn der angegebene Index der höchste Berg ist, dann wird die Größe auf Null gesetzt, sonst verliere ich. Wiederholen Sie das Szenario, bis alle Berge auf Null eingestellt sind.
Hier ist der Code, den ich schrieb:
open System
type Mountain = {Id:int; Height:int}
let readlineInt() = int(Console.In.ReadLine())
let readMountainData id = {Id = id; Height = readlineInt()}
let readAllMountainsData = [ for a in 0 .. 7 do yield readMountainData a ]
let rec mainLoop() =
let mountains = readAllMountainsData
let highestMountain = mountains |> List.maxBy (fun x -> x.Height)
printfn "%i" highestMountain.Id
mainLoop()
mainLoop()
Dieser Code zu einer Endlosschleife wird, ich glaube, es ist, weil die
let readlineInt() = int(Console.In.ReadLine())
unveränderlich ist, so wird der Wert einmal und nach dem es höre nie wieder auf, um die Zeile zu lesen. Ich versuche, "veränderbare" Schlüsselwort für
let mutable readAllMountainsData = [ for a in 0 .. 7 do yield readMountainData a ]
zu setzen, aber es änderte nichts. Haben Sie eine Idee?
Edit: Ich weiß, dass dieser Code in eine Endlosschleife wird, weil nach dem Hinzufügen in die Hauptschleife wie folgt anmelden:
let rec mainLoop() =
let mountains = readAllMountainsData
Console.Error.WriteLine("Mountain Count:{0} ", mountains.Length)
mountains |> List.iter (fun x -> Console.Error.WriteLine("Mountain Id:{0} Height:{1}", x.Id, x.Height))
let highestMountain = mountains |> List.maxBy (fun x -> x.Height)
printfn "%i" highestMountain.Id
mainLoop()
Dann habe ich dies in der Ausgabe:
Standard Error Stream:
Mountain Count:8
Mountain Id:0 Height:9
Mountain Id:1 Height:8
Mountain Id:2 Height:7
Mountain Id:3 Height:6
Mountain Id:4 Height:5
Mountain Id:5 Height:4
Mountain Id:6 Height:3
Mountain Id:7 Height:2
Mountain Count:8
Mountain Id:0 Height:9
Mountain Id:1 Height:8
Mountain Id:2 Height:7
Mountain Id:3 Height:6
Mountain Id:4 Height:5
Mountain Id:5 Height:4
Mountain Id:6 Height:3
Mountain Id:7 Height:2
Mountain Count:8
Mountain Id:0 Height:9
Mountain Id:1 Height:8
Mountain Id:2 Height:7
etc...
Warum möchte ich den Wert erneut lesen? Weil die Werte von einer externen Quelle stammen. So ist der Arbeitsablauf ist wie folgt:
Loop one:
I read 8 values for the height of the mountains in the console
I output the value of the highest mountain
Loop two:
I read 8 values for the height of the mountains in the console
I output the value of the highest mountain
Loop three:
I read 8 values for the height of the mountains in the console
I output the value of the highest mountain
etc
Warum denken Sie, dass der Code in Endlosschleife geht? –
Ich habe gerade den Beitrag bearbeitet, um deine Frage zu beantworten. Es ist, weil ich es sehen kann, wenn ich die Daten im Fehlerstrom drucke. –