我有多个代码块,它们要么以不可恢复的错误结束,要么被用户输入取消,要么为下一个代码块提供输入值。那么如何处理最后一步,即Success(所有计算成功完成)。
type Res<'T> =
| Next of 'T
| Cancel
| Fail of string
module Res =
let bind arg f =
match arg with
| Next x -> f x
| Cancel -> Cancel
| Fail x -> Fail x
我现在可以像这样将这些步骤串在一起,唉,类型 Res<unit> 具有特殊的含义。
let (|?>) = Res.bind
firstFunc()
|?> fun intermediateResult ->
secondFunc intermediateResult
...
|?> fun otherResult ->
lastFunc otherResult
|> function
| Fail msg -> printfn "Error: %s" msg
| Cancel -> printfn "Cancelled"
| Next() -> printfn "Succeeded"
如果我将Success编码为离散的替代方案,我将在最后一个子句中使用额外的案例Next _ 。解决这个问题的首选方法是什么?