Как получить доступ к списку в OCaml - PullRequest
4 голосов
/ 23 декабря 2010

Я хочу написать функцию, которая может проверять каждый элемент в списке: true или false. Если хотя бы один элемент равен 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 ]

8 голосов
/ 23 декабря 2010

Взгляните на модуль 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 будет ложью.

Для общего доступа к списку вы обычно делаете это с помощью сопоставления с образцом и рекурсии или с использованием функций itermap, fold_left и fold_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 *)

edit: как написал Чак, вместо fun x -> not x вы можете просто использовать not.

Другая возможностьиспользовать функцию mem:

List.mem false bools
7 голосов
/ 23 декабря 2010
let rec checkFalse xs =
    match xs with [] -> false
    | false :: _ -> true
    | _ :: tl -> checkFalse tl;;
6 голосов
/ 23 декабря 2010

Самый простой способ будет просто let checkFalse = List.exists not.

List.exists принимает функцию и список в качестве аргументов и сообщает, что переданная функция возвращает true для любого элемента в списке. not возвращает отрицание bool.

0 голосов
/ 13 января 2011

let checkFalse = List.exists (fun elem -> elem = false) your_list в

doc: val существует: ('a -> bool) ->' список -> bool

существует p [a1;...;an] проверяет, удовлетворяет ли хотя бы один элемент списка предикату p.

То есть возвращает (p a1) ||(p a2) ||... ||(p an).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...