Предоставлено список [Some 1; Some 2; Some 3]
Я бы хотел получить Some 6
. При наличии списка [Some 1; None]
должно получиться None
.Складной список опций
Но я нахожу это немного сложнее, чем я думал, чтобы достичь этого чистым способом.
Лучшее, что я мог придумать было это
let someNums = [Some 1; Some 2; Some 3]
someNums
|> List.reduce (fun st v ->
Option.bind (fun x ->
Option.map (fun y -> x + y) st) v)
Это траверс, если у вас есть 'sequenceA', это будет' sequenceA [Some 1; Немного 2; Некоторые 3] |> Option.map List.sum' искать код для sequenceA, FsControl имеет его. – Gustavo
@Gustavo;) вы должны сделать это ответом - хотя я думаю, что 'FsControl' просто немного тяжело для * common * F # er ...' pure' Haskell зависть, если вы будете ^^ – Carsten
Да @Carsten, I Согласитесь, слишком тяжело для этого кода, поэтому я сделал это как комментарий. Это однолинейное решение, оно может быть обобщено и далее сокращено до 'sequenceA [Some 1; Немного 2; Некоторые 3] | >> sum'. – Gustavo