F# 在match的一个分支中使用异步方法

F# 在match的一个分支中使用异步方法,f#,F#,我开始学习F#和async 我试图转换一些C代码,如下所示: public async Task<string> getValueOrDefault(string? key) { if (key is null) { return "default"; } else { return await getValue(key); } } let getValueOrDefault (key: Option<str

我开始学习F#和async

我试图转换一些C代码,如下所示:

public async Task<string> getValueOrDefault(string? key)
{
  if (key is null)
  {
    return "default";
  }
  else
  {
    return await getValue(key);
  }
}
    let getValueOrDefault (key: Option<string>) =
        async {
            return match key with
            | None -> "default"
            | Some (key) -> getValue key
        }

但这是“正确”的做法吗?这有关系吗?

您的尝试没有什么真正的错误,只是双重计算表达式看起来有点奇怪。 通过在
async{}

这个怎么样:

let getValueOrDefault (key:string option) =
    key 
    |> Option.map getValue
    |> Option.defaultValue (async { return "default"})

在您的第一个F#版本中,您缺少了相当于
wait
关键字的
let
返回

我认为您的第二个版本已经足够了,但是您也可以这样做,其中每个匹配结果都返回自己的值

    let getValueOrDefault (key: Option<string>) =
        async {
            match key with
            | None -> return "default"
            | Some (key) -> return! getValue key
        }
让GetValuerDefault(键:选项)=
异步的{
匹配键
|无->返回“默认值”
|Some(key)->return!getValue key
}

我可能会像Tim在回答中那样写这篇文章,也就是说,将整个方法包装在一个
异步{..}
块中,然后在一个分支中使用
return
return在另一个窗口中。但是,通过将
async{return!e}
转换为
e
,您还可以稍微简化最后一个代码段,因为这是完全等效的

然后你会得到另一个非常优雅的版本,它也编码了同样的逻辑:

let getValueOrDefault (key: Option<string>) =
    match key with
    | None -> async { return "default" }
    | Some (key) -> getValue key
让GetValuerDefault(键:选项)=
匹配键
|无->异步{返回“默认值”}
|Some(key)->getValue键

甚至
让getValueOrDefault=function None->async{return“default”}| Some(key)->getValue key
这是我的第二个版本的一个很好的简化!谢谢这就是我要找的。出于某种原因,我没有想到我可以在比赛中使用两种不同的返回版本
let getValueOrDefault (key: Option<string>) =
    match key with
    | None -> async { return "default" }
    | Some (key) -> getValue key