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

时间:2016-03-10 07:40:39

标签: ocaml

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

我试过

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

我不相信这是有效的,我不是如何使用fold_left这样做,任何指导都将不胜感激

2 个答案:

答案 0 :(得分:3)

为了给答案添加一些清晰度,我想强调一些事情:

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并且不是尾递归。

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

答案 1 :(得分:1)

使用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