1. ホーム
  2. f#

オプションタイプのリストを、noneでない要素だけに凝縮する最良の方法とは?

2023-09-25 12:32:51

質問

aオプションのリストから、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

再帰的でない解決策を見つけるか、この種の標準的な方法が何であるかを調べる方がいいと思います。

どのように解決するのですか?

単純に

List.choose id

のように

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

リスト.選択

id