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