将选项types列表缩减为仅非元素的最佳方式?

我意外地从一个选项列表到一个只包含一些元素的列表,有点麻烦。

我最初的尝试是:

let ga = List.filter (fun xx -> match xx with | Some(g) -> true | None -> false) gao 

但是,当然,这个结果types仍然是一个选项列表。 我不知道如何使用List.map来压缩这个,因为你必须处理匹配语句中的所有情况。 我有一个丑陋的解决scheme,但我想知道是否有更好的东西。

丑陋:

  let rec gOptRemove gdec gacc = match gdec with | head :: tail -> match head with | Some(a) -> gOptRemove tail (a :: gacc) | None -> gOptRemove tail gacc | [] -> gacc 

我宁愿find一个非recursion的解决scheme,或者找出这种东西的标准方式。

只是

 List.choose id 

如在

 > [Some 4; None; Some 2; None] |> List.choose id;; val it : int list = [4; 2] 

List.choose

ID