F# размеченный союз, выбирающий 0 или 1 из списка

Имея программу сопоставления, в которой я сопоставляю массив строк с размеченным объединением, я хочу выбрать экземпляр определенного типа DU. Я знаю, что будет 0 или 1 экземпляр. Есть ли более умный способ сделать это, чем этот?

type thing = { One:int; Two:int; Three:int}

type data = 
    | Alpha of int
    | Bravo of thing
    | Charlie of string
    | Delta of Object

//generate some data
let listData = [
                Alpha(1);
                Alpha(2);
                Bravo( { One = 1; Two = 2; Three = 3 } );
                Charlie("hello");
                Delta("hello again")]

//find the 0 or 1 instances of bravo and return the data as a thing
let result =    listData 
                |> List.map( function | Bravo b -> Some(b) | _ -> None)
                |> List.filter( fun op -> op.IsSome)
                |> (function | [] -> None | h::t -> Some(h.Value))

Спасибо


person Dylan    schedule 29.10.2010    source источник


Ответы (2)


Как насчет

let result =
  listData
  |> List.tryPick (function | Bravo b -> Some b | _ -> None)
person kvb    schedule 29.10.2010

List.tryFind сделает свое дело:

let result = listData
             |> List.tryFind (function | Bravo b -> true | _ -> false)
person dahlbyk    schedule 29.10.2010
comment
Спасибо за предложение. Вместо этого я выбрал List.tryPick, поскольку в результате это фактически дает мне возможность выбора. В результате tryFind возвращает мне параметр данных, который требует дальнейшего синтаксического анализа, чтобы действительно получить значение. - person Dylan; 29.10.2010