Below is a non-tail-recursive function to compute the sum of a list of integers.
let rec sum = function
| [] -> 0
| h::t -> h + (sum t)
The last operation the function performs is the addition. Thus, the function isn't tail-recursive.
Below is a tail-recursive version of the same function.
let sum l =
let rec aux acc = function
| [] -> acc
| h::t -> aux (acc+h) t
in
aux 0 l
Here, the aux
function is tail-recursive: the last operation it performs is calling itself. As a consequence, the latter version of sum
can be used with lists of any length.