4

Console.ReadLine() を文字列 seq に抽象化する関数を書きたい

line = null の場合、seq は中断する必要があります

ConsoleLines(): unit -> string seq

このように使用するには:

for line in ConsoleLines() do
    DoSomething line

この関数をどのように記述しますか?

ありがとう

4

5 に答える 5

6
Seq.initInfinite (fun _ -> Console.ReadLine())
于 2010-10-09T16:13:13.530 に答える
5

あまりきれいではありませんが、期待どおりに機能します。

let rec ConsoleLines() =
    seq {
        match Console.ReadLine() with
        | "" -> yield! Seq.empty
        | x -> yield x; yield! ConsoleLines()
    }
于 2009-02-03T03:53:45.053 に答える
4
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/!/:= を使用する必要があることに注意してください。)

于 2009-02-03T05:54:14.453 に答える
2
let consoleLines = Seq.takeWhile ((<>) "") (seq { while (true) do yield System.Console.ReadLine() })
于 2009-11-11T00:26:27.503 に答える
2

わずかに異なる:

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

let consoleLines() =
    readLines Console.In
于 2009-11-24T01:59:38.310 に答える