通过多个参数聚合然后在F#中进行算术运算

时间:2013-10-02 13:43:28

标签: f#

您好我正在尝试扩展seq.groupby函数。在一个单独的参数上,这是有效的,并且在here之前讨论过,关键代码重复:

let group_fold key value fold acc seq =
seq |> Seq.groupBy key 
    |> Seq.map (fun (key, seq) -> (key, seq |> Seq.map value |> Seq.fold fold acc))


let tuples = [("A",12); ("A",10); ("B",1);  ("C",2); ("C",1)]

let regular = group_fold fst snd (+) 0 tuples 
let piped = tuples  |> group_fold fst snd (+) 0

我想做同样但有多个分组参数。这就是我试过的:

let tuples = [("A", "B", "C", 12); ("A", "B", "C", 10); ("B","B","B",1);  ("C","B","B",2); ("C","B","B", 1)]

let group_fold key1 key2 key3 value fold acc seq =
    seq |> Seq.groupBy (key1 & key2 & key3) 
        |> Seq.map (fun (key1, key2, key3, seq) -> (key1, key2, key3, seq |> Seq.map value |> Seq.fold fold acc))

let piped = tuples  |> group_fold fst snd trd fth (+) 0

这个组由多个项目似乎不起作用。我知道在c#中我会这样做:

tuples.GroupBy(a => new { a.fst, a.snd, a.trd})

如何在Fsharp中执行此操作?

1 个答案:

答案 0 :(得分:3)

像这样:

let group_fold keys value fold acc seq =
    seq |> Seq.groupBy keys 
        |> Seq.map (fun ((key1, key2, key3), seq) -> 
            (key1, key2, key3, seq |> Seq.map value |> Seq.fold fold acc))

let piped = tuples  |> group_fold (fun (k1, k2, k3, _) -> 
    k1, k2, k3) (fun (_, _, _, v) -> v) (+) 0