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.