在F#,我们有List.partition和Array.partition其返回列表的元组分别阵列的元组.
那么,为什么没有Seq.partition返回一个序列元组?
这是一个非常简单的实现: F#Snippets
所以...为什么不是核心的这一部分?
Tom*_*cek 16
在F#4.0(Visual Studio 2015)中,核心库比以前更加统一,但它们仍然没有实现Seq.partition.您可以在F#语言设计讨论中找到更多相关信息:生成两个或多个输出集合的常规函数运算符.
总结是该Seq.partition功能非常棘手,并且可能会引入潜在的性能问题.有几种方法可以工作:
它可以迭代输入集合两次(如FsSnip版本),如果你有复杂的延迟计算(你做了两次),这可能会导致问题
它可以迭代输入一次,但是它必须做一些复杂的可变状态共享(可以秘密分配内存).
因此,Seq.partition在保留您期望的关于该seq<'T>类型的所有良好属性的同时,不能合理地实现.
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
Run Code Online (Sandbox Code Playgroud)