Я использую F # и Chessie для создания последовательности задач (с побочными эффектами), которые могут преуспеть или сбой.
Если что-то не удается, я хочу прекратить выполнение оставшихся задач и отменить те, которые уже выполнены.
К сожалению, когда я нахожусь на пути "сбой", больше нет способа получить результаты успешных задач, чтобы я мог их отбросить назад.
Существует ли "шаблон" функционального программирования, который имеет дело с этим сценарием?
Пример:
let refuel =
async {
printfn "1 executed"
// Fill missile with fuel
return Result<string,string>.Succeed "1"
} |> AR
let enterLaunchCodes =
async {
printfn "2 executed"
//
return Result<string,string>.FailWith "2"
} |> AR
let fireMissile =
async {
printfn "3 executed"
return Result<string,string>.Succeed "3"
} |> AR
let launchSequence =
asyncTrial {
let! a = refuel
let! b = enterLaunchCodes
let! c = fireMissile
return a,b,c
}
let result = launchSequence
|> Chessie.ErrorHandling.AsyncExtensions.Async.ofAsyncResult
|> Async.RunSynchronously
// Result is a failure... how do I know the results of the successful operations here so I can roll them back?
printfn "Result: %A" result