Какой был бы наиболее лаконичный способ go из
(Rank * Suit) option list -> (Rank * Suit) list option
Причина в том, что я читаю из командной строки две руки карт "4S 4H 4D 4C AS; JS KD QC 10H 2C"
, поэтому я разбираю каждую часть рука, затем верните полную руку, которая, очевидно, может потерпеть неудачу. *
Если они все - Some
(из варианта (Ранг * Костюм)), тогда он вернет Some
(из (Rank * Suit) list
)
Итак, я получил
type Rank = One | Two | Three
type Suit = Spades | Hearts
type Card = Rank * Suit
[ Some (One, Spades); Some (Two, Hearts); None ]
|> List.map (fun card -> Option.map (fun actualCard -> ) )
И мой мозг как бы растаял ... Мне кажется, что мне нужен какой-то метод Option.collect ... или Option.reduce что-то ...
Edit
Это последнее утверждение заставило меня задуматься:
cards
|> Seq.map parseCard
|> Seq.fold (fun agg elem ->
match agg with
| Some l ->
match elem with
| Some card -> Some ( l @ [ card ] )
| None -> None
| None -> None ) (Some [])
Должен быть более лаконичный способ?
Edit 2
это оно?
cards
|> Seq.map parseCard
|> Seq.fold (fun agg elem ->
agg |> Option.bind ( fun l ->
elem |> Option.map ( fun card ->
l @ [ card ]
)
)) (Some [])