How can I skip a term with List.Map in OCAML?

SML has a function mapPartial which does exactly this. Sadly this function does not exist in OCaml. However you can easily define it yourself like this:

let map_partial f xs =
  let prepend_option x xs = match x with
  | None -> xs
  | Some x -> x :: xs in
  List.rev (List.fold_left (fun acc x -> prepend_option (f x) acc) [] xs)

Usage:

map_partial (fun x -> if x <> 1 then Some (x+1) else None) [0;1;2;3]

will return [1;3;4].

Or you can use filter_map from extlib as ygrek pointed out.


Both Batteries and Extlib provide an equivalent of mapPartial: their extended List module sprovide a filter_map function of the type ('a -> 'b option) -> 'a list -> 'b list, allowing the map function to select items as well.

Tags:

Ocaml