Quantcast
Channel: Active questions tagged ocaml - Stack Overflow
Viewing all articles
Browse latest Browse all 529

Tail-recursive merge sort in OCaml

$
0
0

I’m trying to implement a tail-recursive list-sorting function in OCaml, and I’ve come up with the following code:

let tailrec_merge_sort l =  let split l =     let rec _split source left right =      match source with        | [] -> (left, right)        | head :: tail -> _split tail right (head :: left)     in _split l [] []  in  let merge l1 l2 =     let rec _merge l1 l2 result =      match l1, l2 with        | [], [] -> result        | [], h :: t | h :: t, [] -> _merge [] t (h :: result)        | h1 :: t1, h2 :: t2 ->            if h1 < h2 then _merge t1 l2 (h1 :: result)            else            _merge l1 t2 (h2 :: result)    in List.rev (_merge l1 l2 [])  in  let rec sort = function    | [] -> []    | [a] -> [a]    | list -> let left, right = split list in merge (sort left) (sort right)  in sort l;;

Yet it seems that it is not actually tail-recursive, since I encounter a "Stack overflow during evaluation (looping recursion?)" error.

Could you please help me spot the non tail-recursive call in this code? I've searched quite a lot, without finding it. Cout it be the let binding in the sort function?


Viewing all articles
Browse latest Browse all 529

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>