F#从控制台读取输入

Raf*_*al 3 recursion f# console.readline

我的代码有点问题,我写的是用于从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
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

你只得到前5行,因为结果readlines是一个懒惰的序列没有完全评估 - 打印序列只打印前5个元素,所以所有得到的评估.

通过运行以下示例,您可以轻松地看到这是事情的工作方式:

let test = 
  seq { for i in 0 .. 1000 do 
          printfn "Returning %d" i
          yield i }

printfn "%A" test
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方法是通过转换为内存列表来完全评估延迟序列:

let  b = readlines() |> List.ofSeq
printf "%A" b
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用for循环遍历这些行并逐个打印:

for line in readlines() do
  printf "%s" line
Run Code Online (Sandbox Code Playgroud)