我想写入抽象到Console.ReadLine()的函数为一个字符串SEQ

带seq应该打破时线=空

ConsoleLines(): unit -> string seq

要使用这样的:

for line in ConsoleLines() do
    DoSomething line

你怎么写这样的功能?

由于

有帮助吗?

解决方案

Seq.initInfinite (fun _ -> Console.ReadLine())

其他提示

它并不过分漂亮,但它按预期工作:

let rec ConsoleLines() =
    seq {
        match Console.ReadLine() with
        | "" -> yield! Seq.empty
        | x -> yield x; yield! ConsoleLines()
    }
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 / /:!=做一个序列表达内可变状态)

let consoleLines = Seq.takeWhile ((<>) "") (seq { while (true) do yield System.Console.ReadLine() })

稍有不同:

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

let consoleLines() =
    readLines Console.In
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top