List Reversing in Ocaml

How to reverse even sublists of a list if we assume that we count elements from 0. I want the solution to be "manually-coded". I've got a big problem with this task.

For example:

Function([[1;2;3] ; [2;3] ; [1;2;3] ; [5;6;7]])

returns:

([[3;2;1] ; [2;3] ; [3;2;1] ; [5;6;7]])

I already created a function that reverse a single list:

let rev =
  let rec rev_append acc l =
    match l with
      [] -> acc
    | h::t -> rev_append (h::acc) t in
  fun l -> rev_append [] l;;

But now i am stuck.

3 Answers

let rec todo l = let rec aux r = function
       | [] -> []
       | h::t -> (if r then h else rev h)::(aux (not r) t)
in aux true l;;
1
let rev_list l =
  let rec rev_acc acc = function
    | [] -> acc
    | hd::tl -> rev_acc (hd::acc) tl
  in 
  rev_acc [] l

let rev_even l = 
  let rec rev i acc = function
    | [] -> rev_list acc
    | hd::tl ->
      if i mod 2 = 0 then rev (i+1) ((rev_list hd)::acc) tl
      else rev (i+1) (hd::acc) tl
  in 
  rev 0 [] l

note that they are all tail-recursive

edit

A suggestion to Noran:

tail-recursive is quite important in functional programming and OCaml. Please bear in mind.

2

For fun, I've done a stuff like this,

let rev_at_even_idx list = 
  let s0, s1 = ([], 0), [] in
  let aux0 (a, i) x = 
    (x, i mod 2) :: a, succ i 
  in
  let aux1 a = function 
    | l, 0 -> List.rev l :: a 
    | l, _ -> l :: a 
  in 
  List.fold_left aux1 s1 
  @@ fst @@ 
  List.fold_left aux0 s0 list
;;

rev_at_even_idx [[1;2;3] ; [2;3] ; [1;2;3] ; [5;6;7]];;  
- : int list list = [[3; 2; 1]; [2; 3]; [3; 2; 1]; [5; 6; 7]]  

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Maya Lin-Takahashi

Maya Lin-Takahashi

Consumer Tech & Gadget Reviewer

Maya is a hardware enthusiast who tests and reviews smart home devices, smartphones, wearables, and audio gear. She focuses on practical consumer value and build quality.

Share this article
Twitter Facebook Pinterest