假设我们有一条记录,它定义了具有属性
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
,在每次迭代时更新 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