将选项类型列表压缩到只有不是无的元素的最佳方法?

从一个选项列表到一个只包含 Some 元素的列表,我出乎意料地遇到了一点麻烦。

我最初的尝试是:

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

当然,这个结果类型仍然是一个选项列表。我不知道如何使用 List.map 来浓缩它,因为您必须在 match 语句中处理所有情况。我有一个丑陋的解决方案,但我想知道是否有更好的东西。

丑陋:

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

我更愿意找到一个非递归的解决方案,或者找到这种事情的标准方法。

12282 次浏览

很简单

List.choose id

就是

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

列表,选择

身份证

另一种方法是使用 Option 模块函数过滤出具有值的 Options,然后创建一个值列表:

let concreteTypeList =
optionTypeList
|> List.filter (fun v -> Option.isSome v)
|> List.map (fun v -> Option.get v)