如何计算 OCaml 中具有特定 属性 的列表的记录?
How to count records of a list with a specific property in OCaml?
假设我们有一条记录,它定义了具有属性 name
和 age
:
的人员类型
type person = {name:string ; age:int };;
并初始化一个不同类型的列表:
let personlist = [{name="alexander";age=21};{name="benjamin";age=30};{name="claudia";age=21}];;
我如何计算具有特定年龄的类型的数量,比如说 21(亚历山大和克劳迪娅),以便在这种情况下输出为两个?
最直接的方法是合并 List.length
和 List.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
假设我们有一条记录,它定义了具有属性 name
和 age
:
type person = {name:string ; age:int };;
并初始化一个不同类型的列表:
let personlist = [{name="alexander";age=21};{name="benjamin";age=30};{name="claudia";age=21}];;
我如何计算具有特定年龄的类型的数量,比如说 21(亚历山大和克劳迪娅),以便在这种情况下输出为两个?
最直接的方法是合并 List.length
和 List.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