如何在 OCaml 中统计具有特定属性的列表的记录?

问题描述 投票:0回答:1

假设我们有一条记录,它定义了具有属性

name
age
的人员类型:

type person = {name:string ; age:int };;

并初始化不同类型的列表:

let personlist = [{name="alexander";age=21};{name="benjamin";age=30};{name="claudia";age=21}];;

如何计算特定年龄的类型数量,比如说 21(亚历山大和克劳迪娅),这样本例中的输出将是两个?

list count ocaml record
1个回答
3
投票

最直接的方法是将

List.length
List.filter
结合起来。

List.(personlist |> filter (fun p -> p.age = 21) |> length)

但是,这效率有些低。我们可以一次性完成此操作,因为我们实际上不需要构建匹配人员的列表,然后迭代该列表以查找其长度。

List.fold_left
可以让我们迭代
personlist
,在每次迭代时更新
0
的初始值,具体取决于每个记录的
age
字段是否为
21

List.fold_left (fun i {age; _} -> i + if age = 21 then 1 else 0) 0 personlist

这可以概括为一个

count
函数,它将谓词函数作为参数。

let count p lst = 
  lst 
  |> List.fold_left (fun i x -> i + Bool.to_int (p x)) 0
© www.soinside.com 2019 - 2024. All rights reserved.