Recursion 在OCaml中折叠列表
在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的人(与我不同),它的工作应该非常简单 我正在编写一个函数,当列表中的所有项都满足条件时返
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