如何组合两个seqs(不使用Seq.append)

时间:2015-06-06 20:48:57

标签: f#

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并通过过滤器/映射器发送它们。任何通过它的东西都会被送回,直到没有任何东西通过。

1 个答案:

答案 0 :(得分:1)

您可以编写这样的函数,重复将函数应用于值,直到它满足谓词(AFAIK此函数不存在于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匹配。从我的问题可以看出,这就是你要做的事情。