let filter (l:('a,'b) t) f = 
    let rec filter_rec l = match l with 
      | []   -> []
      | x::c -> if (f x) then x::(filter_rec c)
        else (filter_rec c) 
    in filter_rec !l