我试图围绕如何在F#中完成以下任务。以下是我希望复制的简化的 C# 伪代码等效项。
var x = await GetXAsync();
if (x == null) return "not found";
var y = await GetYAsync(x);
return y;
我的初始 F# 版本如下所示:
task {
let! x = GetXAsync()
match x with
| None -> // need to return a hard-coded value here
| Some x` ->
let! y = GetYAsync(x`)
// More code
// return some value based on y here
}
显然这很糟糕,但我不确定如何进行。我应该在这里尝试完整的 ROP 编程风格,还是有更简单的东西?
在您的示例中,您返回"not found"
字符串以指示否则返回字符串的函数出了问题。我不会这样做,因为很难区分一切正常的情况和没有工作的情况。
如果GetXAsync
返回null
的事实表明失败,那么我只会使用异常。F# 异步对传播这些内容有很好的支持,你可以使用 try .. with
捕获它们。在 F# 中使用异常来处理异常情况并没有错!
exception InvalidX of string
let GetXAsync() = async {
// whetever code that calculates 'failed' and 'result' goes here
if failed then raise (InvalidX "not found")
return result }
然后,您只需调用函数,异常就会自动传播。
async {
let! x = GetXAsync()
let! y = GetYAsync(x)
return y }