Ocaml возвращает список из рекурсивной функции - PullRequest
2 голосов
/ 27 апреля 2011

Я хочу пройти через массив и вернуть список целых чисел (значение индексов), когда значение в массиве соответствует true.

Массив является логическим массивом только значений true / false.

let get_elements (i:int)(b:bool) : int = 
    if b = true then (i::l)
    else (())
;;

let rec true_list (b: bool array) : int list = 
    (fun i l -> get_elements i l)
;;

Синтаксис неверен для моего кода, и я не совсем понимаю, как именно вернуть список целых чисел. Я хочу только вернуть индексы тех элементов, которые истинны в массиве.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

Вы ссылаетесь на 'l' в get_elements, но это не входит в объем этой функции.

Вот подход с использованием ссылки на целочисленный список (изменяемый список):

 boolarray = [|true; false; true; false; false; true|] ;;
 type ilist = (int list) ref ;;
 let intlist () : ilist = ref [] ;;
 let push ( l: ilist) (x: int) : unit = l := x::(!l) ;;
 let lst = intlist () ;;
 Array.iteri ( fun i b -> if b = true then (push lst i )) boolarray ;;
 !lst ;; (* => int list = [5; 2; 0] *)

Или, если вы предпочитаете избегать рефери (что обычно является хорошей идеей), это чище:

let get_true_list (b: bool array) : int list =
  let rec aux i lst  =     
    if (i = Array.length b)  then lst else
      (if b.(i) = true then ( aux (i+1) (i::lst)) else (aux (i+1) lst))  in
   aux 0 [] ;;
 (* using boolarray defined above *)
 get_true_list boolarray ;; (* => int list = [5; 2; 0] *)
2 голосов
/ 27 апреля 2011
I present an example which does not use state, avoids the 'if then else' construct making it easier to read and verify.

let mylist = [| true; false; false; true; false; true |] in
let get_true_indexes arr = 
    let a = Array.to_list arr in
    let rec aux lst i acc = match lst with
        | []                 -> List.rev acc 
        | h::t when h = true -> aux t (i+1) (i::acc)
        | h::t               -> aux t (i+1) acc
    in
    aux a 0 []
in
get_true_indexes mylist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...