为什么F#中没有Seq.partition

时间:2015-07-31 16:05:09

标签: f#

在F#中,我们有List.partitionArray.partition,它们分别返回一个列表元组和一个数组元组。

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

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

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

2 个答案:

答案 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