可以说你需要将一个序列分组为一个元组序列。每个元组都是一个密钥* 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