gpt4 book ai didi

f# - F# 中的分组总数 - 使用序列很容易,是否可以使用列表?

转载 作者:行者123 更新时间:2023-12-04 09:28:03 25 4
gpt4 key购买 nike

给定一组组 id/value 元组的序列,很容易计算组总数(与我使用 C# 和 LINQ 的方法几乎相同):

let items = ["g1",5; "g2",10; "g1",20]

let groupsums =
items
|> Seq.groupBy (fun x -> fst x)
|> Seq.map (fun (g, s) -> Seq.fold (fun acc x -> acc + snd x) 0 s)

但是作为 F# 的新手,我看不到与列表相同的方法。我是否必须使用可变变量,或者是否有一种功能方法可以对列表执行相同的操作?

最佳答案

没有内置 List.groupBy .许多 F# 内置类型具有分配了所述函数的 seq 版本的函数。例如来自 list.fslet inline sumBy f (list : list<_>) = Seq.sumBy f list
我很确定 F# 的设计者有很多关于为了一致性而复制什么以及为了 DRY 而省略什么的讨论。我个人希望他们坚持 DRY。

如果您想制作自己的“功能性” List.groupBy,我会使用 map 和列表。

let groupBy list =
list
|> List.fold (fun group (g, x) ->
match group |> Map.tryFind g with
| Some(s) -> group |> Map.remove g |> Map.add g (x::s)
| None -> group |> Map.add g [x]
) Map.empty
|> Map.toList

let groupsums = groupBy >> List.map (snd >> List.sum)

如果您只需要总和,则可以跳过保留列表。
let groupAndSumBy list =
list
|> List.fold (fun group (g, x) ->
match group |> Map.tryFind g with
| Some(s) -> group |> Map.remove g |> Map.add g (x + s)
| None -> group |> Map.add g x
) Map.empty
|> Map.toList
|> List.map snd

输出
> groupsums items;;
val it : int list = [25; 10]

> groupAndSumBy items;;
val it : int list = [25; 10]

关于f# - F# 中的分组总数 - 使用序列很容易,是否可以使用列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com