Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Splitting a list of items into two lists of odd and even indexed items

I would like to make a function that accepts a list and returns two lists: the first contains every odd item, and the second contains every even item.

For example, given [1;2;4;6;7;9], I would like to return [ [1;4;7] ; [2;6;9] ].

I have written this so far and I do not know how to progress.

let splitList list =
    let rec splitOdd oList list1 list2 =
        match oList with
        | [] -> []
        | head :: tail -> splitEven tail (list1::head) list2
    and splitEven oList list1 list2 =
        match oList with
        | [] -> []
        | head :: tail -> splitOdd tail list1 (list2::head)
    splitOdd list [] []
like image 948
Nathron Avatar asked Oct 30 '11 00:10

Nathron


1 Answers

Implementation which does not stack-overflows:

let splitList list = List.foldBack (fun x (l,r) -> x::r, l) list ([],[])
like image 54
Ed'ka Avatar answered Sep 29 '22 10:09

Ed'ka