【发布时间】:2017-07-27 20:53:50
【问题描述】:
我是 F# 的新手,我正在编写一些小挑战来学习有关该语言的基本细节。我认为由于不可变性,我遇到了问题。
场景: 我必须在控制台中读取高度线,每行包含一个整数。该整数代表一座山的大小。 阅读输入后,我需要写下最高山脉的行号。 如果给定的索引是最高的山,那么大小设置为零,否则我会松动。 重复该场景,直到所有山脉的大小都设置为零。
这里是我写的代码:
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
【问题讨论】:
-
为什么你认为代码进入了无限循环?
-
我刚刚编辑了帖子来回答您的问题。这是因为如果我打印错误流中的数据,我可以看到它。
标签: f# immutability purely-functional