F#从控制台读取输入

时间:2019-01-07 22:03:29

标签: recursion f# console.readline

我的代码有一个小问题,我编写的代码是用于读取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

1 个答案:

答案 0 :(得分: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