私はF#に新たなんだと私は言語についての核心ザラザラの詳細を学ぶために少しの課題をコーディングしています。私は不変のために問題があると思う。F#不変性は、純粋な機能や副作用
シナリオ: Iコンソールの高ラインを読まなければならない、各行が1つの整数を含んでいます。その整数は山の大きさを表します。 入力を読み終えたら、最高の山々の行番号を書く必要があります。 与えられたインデックスが最高の山の場合、サイズはゼロに設定されます。 すべての山のサイズがゼロになるまでシナリオを繰り返します。
ここで私が書いたコード:
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()
このコードは無限ループに起こっている、私は
let readlineInt() = int(Console.In.ReadLine())
は不変なので、値は、一度設定されていると、それはだ後からだと信じています行を読むために決して再び停止しないでください。
let mutable readAllMountainsData = [ for a in 0 .. 7 do yield readMountainData a ]
については、「変更可能」のキーワードを入れようとしていますが、何も変わりませんでした。 ご存知ですか?
編集:私はこのコードが原因の追加以下のようにメインループにログインした後に無限ループに入っていることを知っている :
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()
は、その後、私は出力でこれを持っている:
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...
は、なぜ私は値を再読み込みしたいですか?値は外部ソースによって提供されるためです。したがって、ワークフローは以下のようになります。
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
なぜコードが無限ループに入っていると思いますか? –
私はちょうどあなたの質問に答えるために投稿を編集しました。これは、エラーストリームにデータを印刷すると見ることができるからです。 –