F# 从控制台读取输入
F# Reading input from console
我编写的代码有点问题,我编写的代码用于在 F# 中以行序列的形式从控制台读取输入。
我的问题是它只读取了 5 行文本然后结束,但它应该读取更多行。如果有人告诉我这段代码有什么问题,那就太好了。
screen from console
let allList = new List<string>()
let rec readlines () = seq {
let line = Console.ReadLine()
let b = allList.Add(line)
if line <> null then
yield line
yield! readlines ()
}
let b = readlines()
printf "%A" b
您只会得到前 5 行,因为 readlines
的结果是一个未完全计算的惰性序列 - 打印序列只会打印前 5 个元素,因此这就是所有被评估的元素。
您可以通过 运行 下面的示例轻松地看出事情是这样工作的:
let test =
seq { for i in 0 .. 1000 do
printfn "Returning %d" i
yield i }
printfn "%A" test
一个简单的解决方法是通过转换为内存中的列表来完全评估延迟序列:
let b = readlines() |> List.ofSeq
printf "%A" b
或者,您也可以使用 for
循环遍历这些行并逐行打印它们:
for line in readlines() do
printf "%s" line
我编写的代码有点问题,我编写的代码用于在 F# 中以行序列的形式从控制台读取输入。 我的问题是它只读取了 5 行文本然后结束,但它应该读取更多行。如果有人告诉我这段代码有什么问题,那就太好了。
screen from console
let allList = new List<string>()
let rec readlines () = seq {
let line = Console.ReadLine()
let b = allList.Add(line)
if line <> null then
yield line
yield! readlines ()
}
let b = readlines()
printf "%A" b
您只会得到前 5 行,因为 readlines
的结果是一个未完全计算的惰性序列 - 打印序列只会打印前 5 个元素,因此这就是所有被评估的元素。
您可以通过 运行 下面的示例轻松地看出事情是这样工作的:
let test =
seq { for i in 0 .. 1000 do
printfn "Returning %d" i
yield i }
printfn "%A" test
一个简单的解决方法是通过转换为内存中的列表来完全评估延迟序列:
let b = readlines() |> List.ofSeq
printf "%A" b
或者,您也可以使用 for
循环遍历这些行并逐行打印它们:
for line in readlines() do
printf "%s" line