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并通过过滤器/映射器发送它们。任何通过它的东西都会被送回,直到没有任何东西通过。
答案 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
匹配。从我的问题可以看出,这就是你要做的事情。