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

How to count records of a list with a specific property in OCaml?

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

的人员类型
type person = {name:string ; age:int };;

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

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

我如何计算具有特定年龄的类型的数量,比如说 21(亚历山大和克劳迪娅),以便在这种情况下输出为两个?

最直接的方法是合并 List.lengthList.filter

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

但是,这比它应该的效率要低一些。我们可以一次完成,因为我们真的不需要构建匹配人员列表,然后遍历该列表以找到它的长度。

List.fold_left 将让我们遍历 personlist,根据每条记录的 age 字段是否为 [=] 在每次迭代中更新 0 的初始值18=]与否。

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