如何合并两个序列(不使用 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
。从你的问题我可以看出,这就是你想要做的。
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
。从你的问题我可以看出,这就是你想要做的。