F# 在match的一个分支中使用异步方法
我开始学习F#和async 我试图转换一些C代码,如下所示: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
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