从一个选项列表到只包含一些元素的列表,我出乎意料地遇到了一些麻烦。
我最初的尝试是:
let ga = List.filter (fun xx ->
match xx with
| Some(g) -> true
| None -> false) gao
但是,当然,这种结果类型仍然是一个选项列表。我不知道如何使用List.map来压缩它,因为你必须处理匹配语句中的所有情况。我有一个丑陋的解决方案,但我想知道是否有更好的东西。
丑:
let rec gOptRemove gdec gacc =
match gdec with
| head :: tail ->
match head with
| Some(a) -> gOptRemove tail (a :: gacc)
| None -> gOptRemove tail gacc
| [] -> gacc
我更愿意找到一个非递归的解决方案,或者找出这种方法的标准方法。
答案 0 :(得分:120)
简单地
List.choose id
,如
> [Some 4; None; Some 2; None] |> List.choose id;;
val it : int list = [4; 2]
答案 1 :(得分:0)
另一种方法是使用“选项”模块功能过滤带有值的“选项”,然后创建值列表:
let concreteTypeList =
optionTypeList
|> List.filter (fun v -> Option.isSome v)
|> List.map (fun v -> Option.get v)