如何使用fold_left编写函数而不使用fold来计算列表中元素的数量?
我试过
let rec count_elements l c =
match l with
|[] -> c
|h::t -> c = c+1
我不相信这是有效的,我不是如何使用fold_left这样做,任何指导都将不胜感激
答案 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
。