簡體   English   中英

為什么 F# 中沒有 Seq.partition

[英]Why is there no Seq.partition in F#

在 F# 中,我們有List.partitionArray.partition ,它們分別返回一個列表元組和一個數組元組。

那么,為什么沒有Seq.partition返回序列元組?

這是一個非常簡單的實現: F# Snippets

所以......為什么這不是核心的一部分?

在 F# 4.0 (Visual Studio 2015) 中,核心庫比以前更加統一,但它們仍然沒有實現Seq.partition 您可以在 F# 語言設計討論中找到更多相關信息: 生成兩個或多個輸出集合的常規函數​​運算符

總結是Seq.partition函數非常棘手,擁有它可能會引入潛在的性能問題。 它有幾種工作方式:

  • 它可以迭代輸入集合兩次(如 FsSnip 版本),如果您有復雜的延遲計算(您將所有事情都做兩次),這可能會導致問題

  • 它可以對輸入進行一次迭代,但隨后必須進行一些復雜的可變狀態共享(這可能會秘密分配內存)。

因此,在保留您對seq<'T>類型所期望的所有良好屬性的同時,不能合理地實現Seq.partition

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM