将选项类型列表缩减为仅非元素的最佳方法?

时间:2010-08-23 14:32:05

标签: f# functional-programming

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

我最初的尝试是:

    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

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

2 个答案:

答案 0 :(得分:120)

简单地

List.choose id

,如

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

List.choose

id

答案 1 :(得分:0)

另一种方法是使用“选项”模块功能过滤带有值的“选项”,然后创建值列表:

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