F # Чтение ввода с консоли - PullRequest
0 голосов
/ 08 января 2019

У меня есть небольшая проблема с моим кодом, который я написал для чтения ввода с консоли в 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

1 Ответ

0 голосов
/ 08 января 2019

Вы получаете только первые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...