[英]Why is there no Seq.partition in F#
在 F# 中,我們有List.partition
和Array.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.