let filter_map f l = (* ('a -> 'b option) -> 'a list -> 'b list *)
let rec aux accu = function
| [] -> accu
| h::t -> (match f h with
| None -> aux accu t
| Some v -> aux (v::accu) t)
in aux [] l