如何编写一个函数来计算列表中元素的数量?

How to write a function to count the number of elements in a list?

如何使用 fold_left 而不是使用 fold 来编写函数来计算列表中的元素数?

我试过了

 let rec count_elements l c =
     match l with
     |[] ->  c
     |h::t -> c = c+1

我不相信这行得通,我也不知道如何使用 fold_left,任何指导将不胜感激

使用fold_left,你可以这样做:

# let size l = List.fold_left (fun acc _ -> acc + 1) 0 l;;
val size : 'a list -> int = <fun>
# size [1;2;3];;
- : int = 3
# size [];;
- : int = 0
#

您从累加器 0 开始,然后为列表中的每个元素添加它 +1

为了让答案更加清晰,我想强调一些事情:

fold_left 只是一种以尾递归方式对列表进行某些操作的方法。理解 fold_left 的最好方法是自己实现它:

# let fold_left f acc l =
    let rec fr acc l =
      match l with
        | [] -> acc
        | hd :: tl -> fr (f acc hd) tl
    in fr acc l;;
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>

这正是你写时的长度

# let length l = List.fold_left (fun c _ -> c + 1) 0 l;;
val length : 'a list -> int = <fun>

发生的事情等同于:

# let length l =
    let rec lr acc l =
      match l with
        | [] -> acc
        | _ :: tl -> lr (acc + 1) tl
     in lr 0 l;;
val length : 'a list -> int = <fun>

所以,解决方案

let rec length l =
  match l with
    | [] -> 0
    | _ :: tl -> 1 + length tl

对应于fold_right,不是尾递归。

希望这会为您澄清一些事情:-)