F#序列过滤器处于功能样式

use*_*704 5 f# functional-programming filter seq

我有一系列需要过滤的数据.这很明显,因为我们Seq.filter有价值.但是,我的问题是我需要过滤,直到最终的集合将达到一定数量的项目.我不想对所有项目执行过滤而不是截断,我想在不再需要它的时候停止过滤.

在命令式编程中,基本上这是一项非常简单的任务 - 我可以在F#中轻松完成,就像在C#中完成一样,但我想在功能风格上做到这一点.

我已经看了一下该Collections.Seq模块,但我没有发现任何可以帮助我的东西.事实上我需要类似的东西filterWhile.有任何想法吗?

谢谢你的帮助.

Gus*_*Gus 10

您只需使用Seq.filter后跟一个Seq.take您感兴趣的结果数量:

Seq.filter并且Seq.take是懒惰的,然后当强制seq时,一旦结果达到所需的大小,它将停止过滤.

这是一个例子,使用无限序列来测试它是否真的停止过滤:

Seq.initInfinite id  
    |> Seq.filter (fun x -> x % 2 = 0)
    |> Seq.take 10
    // then if you force the Seq
    |> Seq.toArray
Run Code Online (Sandbox Code Playgroud)

这是一种功能风格,这是你使用惰性集合解决FP语言问题的方式,例如在Haskell中,这是一种纯FP语言,你用同样的方式对列表进行操作:take 10 (filter (\x -> mod x 2 == 0) [0..]).