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

时间:2014-12-02 08:41:23

标签: filter f# functional-programming seq

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

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

我已经看了Collections.Seq模块,但我找不到任何可以帮助我的东西。事实上,我需要像filterWhile这样的东西。有什么想法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:10)

您只需使用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语言问题的方法,例如在Haskell中,这是一种纯FP语言,你用同样的方式对列表进行处理:take 10 (filter (\x -> mod x 2 == 0) [0..])