给定一组 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.fs
let inline sumBy f (list : list<_>) = Seq.sumBy f list
我很确定 F# 的设计者对于为了一致性而重复什么以及为了 DRY 而省略什么进行了很多讨论。我个人希望他们坚持 DRY。
如果你想制作自己的“功能性”List.groupBy,我会使用地图和列表。
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
Output
> groupsums items;;
val it : int list = [25; 10]
> groupAndSumBy items;;
val it : int list = [25; 10]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)