在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:如果对于在某个列表l中的每个x都满足条件x,则为真。但是,我正在使用fold函数实现该函数,但我被卡住了。具体来说,我不知道列表应该返回什么。我知道理想情况下,应该将条件应用于列表中的每个项目,但我不知道语法应该是什么样子。x && acc
可以工作,但它未通过非常简单的测试(如下所示)。
let test () : bool =
not (for_all (fun x -> x > 0) [1; 2; -5; -33; 2])
;; run_test "for_all: multiple elements; returns false" test
这是我的初步尝试。欢迎任何帮助:
let for_all (pred: 'a -> bool) (l: 'a list) : bool =
fold (fun(x:'a)(acc: bool)-> _?_&&_?_ )false l