在F#中,我们有List.partition
和Array.partition
,它们分别返回一个列表元组和一个数组元组。
那么,为什么没有Seq.partition
返回一个序列元组?
这是一个非常简单的实现: F# Snippets
所以...为什么不是核心的这一部分?
答案 0 :(得分:15)
在F#4.0(Visual Studio 2015)中,核心库比以前更加统一,但它们仍然没有Seq.partition
的实现。您可以在F#语言设计讨论中找到更多相关信息:Regular functional operators producing two or more output collections。
摘要是Seq.partition
函数非常棘手,并且可能会引入潜在的性能问题。有几种方法可以工作:
它可以迭代两次输入集合(比如FsSnip版本),如果你有复杂的延迟计算(你做了两次所有事情)会导致问题
它可以迭代输入一次,但是它必须进行一些复杂的可变状态共享(可以秘密分配内存)。
因此,Seq.partition
无法合理地实现,同时保留了您对seq<'T>
类型所期望的所有良好属性。
答案 1 :(得分:1)
Seq.partition
只是Seq.groupBy
的一个专用版本,因此标准库可以将前者作为后者的包装来实现,而不会引入任何新问题。
let partition predicate source =
let map =
source
|> Seq.groupBy predicate
|> Map.ofSeq
let get flag =
map
|> Map.tryFind flag
|> Option.defaultValue Seq.empty
get true, get false