list_map_partial

type t = A of int | B of string

みたいな場合に、t listから A(i)のiだけ取り出して int list を作りたい時など。

(*
  val list_map_partial : ('a -> 'b option) -> 'a list -> 'b list
*)
let list_map_partial f lst = 
  List.rev
  (List.fold_left
    (fun a x ->
       match f x with
       | Some(y) -> y :: a
       | None    -> a
    )
    []
    lst
  )

list_map_partial f lst で、lstの各要素にfを適用し、結果がSome(x)だった要素のxのみをつないだリストを返す。

  List.map
    (function | A(i) -> i | _ -> failwith "")
    (List.filter (function | A(_) -> true | B(_) -> false) lst)

みたいな書き方は美しくないし、毎回fold_leftも書きたくないのでライブラリ化。