web-dev-qa-db-ja.com

オプションタイプのリストを、どれでもない要素のみに凝縮する最良の方法は?

オプションのリストから、Someである要素のみを含むリストに移動する際に、予期せず少し問題が発生しました。

私の最初の試みは:

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

しかしもちろん、この結果タイプはまだオプションリストです。すべてのケースをmatchステートメントで処理する必要があるため、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

非再帰的な解決策を見つけるか、この種のことの標準的な方法を見つけたいと思います。

65
Tony Peterson

単に

List.choose id

のように

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

List.choose

id

126
Brian