F# 如何将 Console.ReadLine() 抽象为字符串 seq

发布于 2024-07-13 06:35:47 字数 270 浏览 5 评论 0原文

我想编写一个函数将 Console.ReadLine() 抽象为字符串 seq ,

当 line = null 时 seq 应该中断

ConsoleLines(): unit -> string seq

要像这样使用:

for line in ConsoleLines() do
    DoSomething line

你如何编写这个函数?

谢谢

I want to write a function to abstract Console.ReadLine() into a string seq

the seq should break when line = null

ConsoleLines(): unit -> string seq

To be used like this:

for line in ConsoleLines() do
    DoSomething line

How do you write this function?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

沉睡月亮 2024-07-20 06:35:47
Seq.initInfinite (fun _ -> Console.ReadLine())
Seq.initInfinite (fun _ -> Console.ReadLine())
千秋岁 2024-07-20 06:35:47

它不是太漂亮,但它按预期工作:

let rec ConsoleLines() =
    seq {
        match Console.ReadLine() with
        | "" -> yield! Seq.empty
        | x -> yield x; yield! ConsoleLines()
    }

Its not overly pretty, but it works as expected:

let rec ConsoleLines() =
    seq {
        match Console.ReadLine() with
        | "" -> yield! Seq.empty
        | x -> yield x; yield! ConsoleLines()
    }
反目相谮 2024-07-20 06:35:47
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 {
        let finished = ref false
        while not !finished do
            let s = System.Console.ReadLine()
            if s <> null then
                yield s
            else
                finished := true
    }

(Note that you must use ref/!/:= to do mutable state inside a sequence expression.)

话少心凉 2024-07-20 06:35:47

稍微不一样:

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

let consoleLines() =
    readLines Console.In

Slightly different:

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

let consoleLines() =
    readLines Console.In
只等公子 2024-07-20 06:35:47
let consoleLines = Seq.takeWhile ((<>) "") (seq { while (true) do yield System.Console.ReadLine() })
let consoleLines = Seq.takeWhile ((<>) "") (seq { while (true) do yield System.Console.ReadLine() })
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文