4

我的代码有一个小问题,我编写它是为了从 F# 中的控制台读取输入作为行序列。我的问题是它只读取 5 行文本然后结束,但它应该读取更多行。如果有人告诉我这段代码有什么问题,那就太好了。

来自控制台的屏幕

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
4

1 回答 1

6

你只得到前 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
于 2019-01-07T22:28:29.833 回答