Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access a list in OCaml

Tags:

find

ocaml

I want to write a function that could check every item in a list is true or false. If at least one element is false, it will return true, so that:

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

I am an absolute beginner in OCaml and I don't know how to approach this. I tried using a for loop, something like:

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)

Then it said "Unbound record field...."

I also tried using find like: if (find false bools != Not_found) then true else false

But my ways did not work. I came from a Java background.

like image 882
Mariska Avatar asked Nov 29 '22 17:11

Mariska


1 Answers

Take a look at the List module: http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html specifically the exists method. For what you want, you can simply do this:

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

The exists function will return true if any element in the list satisfies the predicate (the function). In this case, the predicate is fun x -> not x which will return true if x is false.

For general list access, you generally do this using pattern matching and recursion, or using the functions iter, map, fold_left, and fold_right (among others). Here's an implementation of exists using pattern matching:

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 *)

edit: as Chuck has posted, instead of fun x -> not x you can just simply use not.

Another possibility is to use the mem function:

List.mem false bools
like image 103
Niki Yoshiuchi Avatar answered Dec 19 '22 22:12

Niki Yoshiuchi