Лучший способ сократить список типов опций до элементов, которые не равны?

У меня неожиданно возникли проблемы с переходом от списка опций к списку, содержащему только элементы, являющиеся элементами 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

Я бы предпочел найти нерекурсивное решение или выяснить, каков стандартный способ для такого рода вещей.

62
задан svick 1 June 2015 в 12:49
поделиться