为什么F#中没有Seq.partition

Lui*_*iso 9 f#

在F#,我们有List.partitionArray.partition其返回列表的元组分别阵列的元组.

那么,为什么没有Seq.partition返回一个序列元组?

这是一个非常简单的实现: F#Snippets

所以...为什么不是核心的这一部分?

Tom*_*cek 16

在F#4.0(Visual Studio 2015)中,核心库比以前更加统一,但它们仍然没有实现Seq.partition.您可以在F#语言设计讨论中找到更多相关信息:生成两个或多个输出集合的常规函数​​运算符.

总结是该Seq.partition功能非常棘手,并且可能会引入潜在的性能问题.有几种方法可以工作:

  • 它可以迭代输入集合两次(如FsSnip版本),如果你有复杂的延迟计算(你做了两次),这可能会导致问题

  • 它可以迭代输入一次,但是它必须做一些复杂的可变状态共享(可以秘密分配内存).

因此,Seq.partition在保留您期望的关于该seq<'T>类型的所有良好属性的同时,不能合理地实现.


bri*_*rns 5

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)