Recursion 在OCaml中折叠列表

Recursion 在OCaml中折叠列表,recursion,ocaml,fold,Recursion,Ocaml,Fold,在OCaml中,典型的折叠函数如下所示: let rec fold (combine: 'a -> 'b -> 'b) (base: 'b) (l: 'a list) : 'b = begin match l with | [] -> base | x :: xs -> combine x (fold combine base xs) end 对于那些熟悉OCaml的人(与我不同),它的工作应该非常简单 我正在编写一个函数,当列表中的所有项都满足条件时返

在OCaml中,典型的折叠函数如下所示:

let rec fold (combine: 'a -> 'b -> 'b) (base: 'b) (l: 'a list) : 'b =
  begin match l with
  | [] -> base
  | x :: xs -> combine x (fold combine base xs)
  end
对于那些熟悉OCaml的人(与我不同),它的工作应该非常简单

我正在编写一个函数,当列表中的所有项都满足条件时返回true:如果条件x对于某个列表l中的所有x都为true。然而,我用折叠函数实现这个函数,我被卡住了。具体来说,我不知道列表应该返回什么。我知道理想情况下,条件应该应用于列表中的每个项目,但我不知道语法应该是什么样子
x&&acc
可以工作,但它无法通过一个非常简单的测试(如下所示)

这是我的初步尝试。感谢您的帮助:

let  for_all (pred: 'a -> bool) (l: 'a list) : bool =
fold (fun(x:'a)(acc: bool)->  _?_&&_?_  )false l
您的联合收割机功能不应执行
x&&base
,因为列表中的元素通常不是
bool
。您希望谓词函数首先将元素求值为bool,然后使用累加器“and”它

折叠中不需要
开始
结束
。您可以只使用
匹配
进行模式匹配

有两种广泛使用的
折叠
左折叠
右折叠
。您使用的是
fold_right
,它基本上贯穿整个列表,并从列表的末尾到前面开始“组合”。这不是

向左折叠
,另一方面从列表的前面开始,立即将每个元素与累加器组合。这不会通过大量递归函数调用“吃掉”堆栈

let  for_all (pred: 'a -> bool) (l: 'a list) : bool =
fold (fun(x:'a)(acc: bool)->  _?_&&_?_  )false l
let rec fold (combine: 'a -> 'b -> 'b) (base: 'b) (l: 'a list) : 'b =
  match l with
  | [] -> base
  | x::xs -> combine x (fold combine base xs)

let for_all (pred: 'a -> bool) (lst: 'a list) =
  let combine x accum =
    (pred x) && accum
  in
  fold combine true lst