如何合并两个序列(不使用 Seq.append)

How to combine two seqs (not using Seq.append)

type Message =
    | Str of string
    | KeyPress of ConsoleKeyInfo

let keyStream = seq {
    while true do
        yield KeyPress(Console.ReadKey(true)) }

let rec messageStream = 
    keyStream |>
    Seq.combine (messageStream |> Seq.filter filterer) |> filterALot

messageStream |> Seq.iter (fun _ -> ())

这是我的代码。基本上我想要一个 seq 来处理控制台按键,将它们过滤成某些东西,然后通过 seq 将其中的一些发送回去。问题是 Seq.combine 方法:它不存在。我可以使用 append,但这会将它们添加到无限的 keyStream seq 的末尾。 我希望当按键从 messageStream 中推送一条消息时,可以在按键之间插入该消息。

我希望我的问题很清楚。如果不是,我应该澄清什么?

是的,这个问题看起来确实很奇怪。

编辑: 才发现messageStream真的不行

我想做的是获取所有 Console.ReadKey 并通过 filter/mapper 发送它们。任何通过的东西都会被送回,直到没有任何东西通过。

您可以编写这样的函数,重复将函数应用于值,直到它满足谓词(据我所知,F# 核心中不存在此函数):

let rec applyUntil pred f x = if pred x then x else applyUntil pred f (f x)

然后,只需使用此函数进行映射,如下所示:

let mapUntil pred f = Seq.map (applyUntil pred f)

在你的情况下,你会做类似的事情:

mapUntil filterer transformer keyStream

这将重复应用 transformer 到序列的每个元素,直到它匹配 filterer。从你的问题我可以看出,这就是你想要做的。