F # как абстрагировать Console.ReadLine () как строку seq - PullRequest
4 голосов
/ 03 февраля 2009

Я хочу написать функцию для абстрагирования Console.ReadLine () в строку seq

последовательность должна прерваться, когда строка = ноль

ConsoleLines(): unit -> string seq

Для использования следующим образом:

for line in ConsoleLines() do
    DoSomething line

Как вы пишете эту функцию?

Спасибо

Ответы [ 5 ]

5 голосов
/ 03 февраля 2009

Это не слишком красиво, но работает как положено:

let rec ConsoleLines() =
    seq {
        match Console.ReadLine() with
        | "" -> yield! Seq.empty
        | x -> yield x; yield! ConsoleLines()
    }
4 голосов
/ 09 октября 2010
Seq.initInfinite (fun _ -> Console.ReadLine())
4 голосов
/ 03 февраля 2009
let ConsoleLines =
    seq {
        let finished = ref false
        while not !finished do
            let s = System.Console.ReadLine()
            if s <> null then
                yield s
            else
                finished := true
    }

(Обратите внимание, что вы должны использовать ref /! /: =, Чтобы сделать изменяемое состояние внутри выражения последовательности.)

2 голосов
/ 24 ноября 2009

Немного другое:

let readLines (sr:TextReader) =
    Seq.initInfinite (fun _ -> sr.ReadLine())
    |> Seq.takeWhile (fun x -> x <> null)

let consoleLines() =
    readLines Console.In
2 голосов
/ 11 ноября 2009
let consoleLines = Seq.takeWhile ((<>) "") (seq { while (true) do yield System.Console.ReadLine() })
...