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も書きたくないのでライブラリ化。