2014-12-02 15 views
5

我有一系列我需要过滤的数据。这很明显,因为我们有Seq.filter值。但是,我的问题是,我需要过滤,直到产生的集合将达到一定数量的项目。我不想对所有项目执行过滤,也不想对截断进行过滤,我希望在不再需要时立即停止过滤。F#序列过滤器虽然功能风格

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

我看了一下Collections.Seq模块,但是我还没有找到任何能帮助我的东西。实际上我需要类似filterWhile。有任何想法吗?

谢谢你的帮助。

回答

9

你只需要使用Seq.filter接着是Seq.take有结果,你有兴趣获得的数量:

Seq.filterSeq.take懒惰,那么当SEQ被迫将停止过滤,一旦结果达到所需的大小。

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

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

这是一个实用的风格,这是一个使用延迟集合您解决在FP语言问题的办法例如,在纯粹的FP语言Haskell中,您可以使用与列表相同的方式:take 10 (filter (\x -> mod x 2 == 0) [0..])