How to access the list in OCaml

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

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

I am an absolute newbie to OCaml and I do not 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 he said "Unsigned record field ...."

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

But my paths didn’t work. I came from a Java background.

Thank you very much!

+4
source share
4 answers

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

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

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

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

 let rec exists fl = match l with | [] -> false (* the list is empty, return false *) | h::t -> if (fh) 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 ft (* the predicate is false, recursively call the `exists` function on the tail *) 

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

Another possibility is to use the mem function:

 List.mem false bools 
+8
source
 let rec checkFalse xs = match xs with [] -> false | false :: _ -> true | _ :: tl -> checkFalse tl;; 
+7
source

The easiest way: let checkFalse = List.exists not .

List.exists takes a function and a list as arguments and tells whether the function you passed returns true for any element in the list. not returns negation bool.

+6
source

let checkFalse = List.exists (fun elem → elem = false) your_list in

doc: val exists: ('a → bool) →' list → bool

there is p [a1; ...; a] checks if at least one element of the list satisfies the predicate p.

That is, it returns (p a1) || (p a2) || ... || (p an).

0
source

Source: https://habr.com/ru/post/1333103/


All Articles