可以說你需要將一個序列分組爲一個元組序列。每個元組都是一個密鑰* seq。所以從某種意義上說,結果是一系列的序列。是否有可能在f#中編寫像這樣的遞歸分組函數?
迄今爲止所有漂亮的標準。
如果你想進一步按其他一些密鑰對每個子序列進行分組怎麼辦?將另一個groupby函數映射到序列序列的每個元素上是很容易的。然後你會有一系列序列的序列。
開始變得有點毛。
如果您想進一步對它進行分組,那該怎麼辦?
是否有可能編寫一個函數,該函數可以採用密鑰生成函數和任意序列,遞歸解開圖層並使用keyFunction添加另一層分組?
我懷疑答案是否定的,因爲遞歸函數沒有明確定義的類型。
我嘗試在此,進一步說明了想法:
let rec recursiveGrouper keyFunction aSeq =
let first = Seq.head aSeq
match first with
| ((a:'a), _) -> Seq.map (fun (b,(c:seq<'c>)) -> (b, recursiveGrouper keyFunction c)) aSeq
| _ -> Seq.groupBy keyFunction aSeq
編輯:
讓我們添加的如何可能會奏效的例子中,這是可能的
type FruitRecord = {Fruit:string; Number:int; SourceFarm:string; Grade:float}
let key1 fr =
fr.Fruit
let key2 fr =
fr.SourceFarm
let key3 fr =
match fr.Grade with
|f when f > 5.0 -> "Very Good"
|f when f > 2.5 -> "Not bad"
|_ -> "Garbage"
讓比如說我們有一大串水果記錄。我們想按水果類型對它們進行分組。
一種方式是說
let group1 = fruitRecs |> Seq.groupBy key1
使用我們的遞歸函數,這將是
let group1 = recursiveGrouper key1 fruitRecs
接下來,讓我們說我們通過希望將每1組的組項目源農場。
我們可以說
let group2 =
group1
|> Seq.map (fun (f, s) -> (f, Seq.groupBy key2 s))
使用我們的遞歸函數這將是
let group2 = recursiveGrouper key2 group1
而且我們可以進一步和組去了甲級說
let group3 = recursiveGrouper key3 group2
你能添加至少兩個給定輸入的期望輸出的例子嗎? – Gustavo
你並不是真的想'recursiveGrouper'是遞歸的,然後檢查編輯我的答案。 – scrwtp