
let rec map f l =
	if l = [] then []
	else f (hd l) :: map f (tl l)
	
let rec fold_left f a l =
	if l = [] then a
	else fold_left f (f a (hd l)) (tl l)
	
let rec fold_right f l a =
	if l = [] then a
	else f (hd l) (fold_right f (tl l) a)

let rec append l1 l2 =
	if l1 = [] then l2
	else hd l1 :: append (tl l1) l2

let rec rev_append l1 l2 =
	if l1 = [] then l2
	else rev_append (tl l1) (hd l1 :: l2)

let rev l = rev_append l []
	
let rev_append' l1 l2 =
	while l1 != [] do
		l2 := hd l1 :: l2;
		l1 := tl l1
	done;
	l2

let rev' l = rev_append' l []
	
let rec length l =
	if l = [] then 0
	else length (tl l) + 1
	
let length' l =
	let n = 0 in
	while l != [] do
		n := n + 1;
		l := tl l
	done;
	n
