我有一系列需要过滤的数据。这很明显,因为我们有Seq.filter
值。但是,我的问题是我需要过滤,直到最终的集合将达到一定数量的项目。我不想对所有项目执行过滤而不是进行截断,我想在不再需要它的时候停止过滤。
基本上,在命令式编程中这是一项非常简单的任务 - 我可以在F#中轻松完成,就像在C#中完成一样,但我希望以函数式的方式完成。
我已经看了Collections.Seq
模块,但我找不到任何可以帮助我的东西。事实上,我需要像filterWhile
这样的东西。有什么想法吗?
感谢您的帮助。
答案 0 :(得分: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
这是一种功能样式,这是你使用惰性集合解决FP语言问题的方法,例如在Haskell中,这是一种纯FP语言,你用同样的方式对列表进行处理:take 10 (filter (\x -> mod x 2 == 0) [0..])