具有异步和选项的 F# 程序流问题



我试图围绕如何在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 }

相关内容

  • 没有找到相关文章