如何访问OCaml中的列表

时间:2010-12-22 21:27:33

标签: find ocaml

我想编写一个可以检查列表中每个项目truefalse的函数。如果至少有一个元素为false,则会返回true,因此:

assert_eq "checkFalse [true; false; true]" (checkFalse [true; true; true]) false;
assert_eq "checkFalse [false; false]" (checkFalse [false; true]) true;

我是OCaml的绝对初学者,我不知道如何处理这个问题。我尝试使用for循环,例如:

let rec checkFalse (bools: bool list) : bool =
for i = 0 to bools.length do
    if bools.length == false then false
    else... (I don't know how to continue)

然后它说“未绑定记录字段......”

我也尝试过使用find: if (find false bools != Not_found) then true else false

但我的方式不起作用。我来自Java背景。

4 个答案:

答案 0 :(得分:8)

查看List模块:http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html,特别是exists方法。无论你想要什么,你都可以这样做:

List.exists (fun x -> not x) [true;true;...;false;...]

如果列表中的任何元素满足谓词(函数),exists函数将返回true。在这种情况下,谓词为fun x -> not x,如果x为false,则返回true。

对于常规列表访问,通常使用模式匹配和递归,或使用函数itermapfold_leftfold_right(以及其他)来执行此操作。以下是使用模式匹配的exists实现:

let rec exists f l = match l with
  | [] -> false (* the list is empty, return false *)
  | h::t -> if (f h) then true (* the list has a head and a (possibly empty) tail.  Check the return value of the predicate 'f' when applied to the head *)
    else exists f t (* the predicate is false, recursively call the `exists` function on the tail *)

编辑:正如Chuck发布的那样,您只需使用fun x -> not x而不是not

另一种可能性是使用mem函数:

List.mem false bools

答案 1 :(得分:7)

let rec checkFalse xs =
    match xs with [] -> false
    | false :: _ -> true
    | _ :: tl -> checkFalse tl;;

答案 2 :(得分:6)

最简单的方法就是let checkFalse = List.exists not

List.exists将函数和列表作为参数,并告诉您传递的函数是否为列表中的任何元素返回true。 not返回对布尔的否定。

答案 3 :(得分:0)

让checkFalse = List.exists(fun elem - > elem = false)your_list in

DOC: val存在:('a - > bool) - > '列表 - >布尔

存在p [a1; ...; an]检查列表中是否至少有一个元素满足谓词p。

也就是说,它返回(p a1)|| (p a2)|| ...... || (p))。