gpt4 book ai didi

f# - 使用让!内部匹配语句导致编译错误

转载 作者:行者123 更新时间:2023-12-03 21:46:04 25 4
gpt4 key购买 nike

使用 let 有什么限制吗?内部匹配语句?我不确定为什么这不会编译。

module Foo =
let Bar =
async {
let result =
match 1 with
| 1 ->
let! num = async.Return 12345 // Doesn't compile
1
| _ -> 2

return result
}

编译失败并显示“此构造只能在计算表达式中使用”

最佳答案

如前所述,问题在于异步工作流只允许某些类型的嵌套 - 您不能使用 let!在普通表达式中,但仅在计算表达式中。您示例中的问题实际上并不是 matchlet (其中包含 match )。为了更好地了解发生了什么,规范看起来(大致)如下:

cexpr := let! x = expr in cexpr
           |  let x = expr in cexpr
           |  return! expr
           |  (...)



关键是参数只是一个普通的表达式 expr和 body 跟随 letlet!是另一个可以包含更多异步操作的计算表达式。

所以,如果你有 let x = e1 in e2那么你只能拥有 let!e2但不在 e1 .

在实践中,您可以按照 Daniel 的建议使用嵌套异步工作流,或者您可以重写代码,以便需要异步的代码不会在不可能的情况下使用等待表达式 - 很难说怎么做这是一般的,但在你的具体例子中,你可以只写:
let bar = async {      
match 1 with
| 1 ->
let! num = async.Return 12345
return 1
| _ ->
return 2 }

关于f# - 使用让!内部匹配语句导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20913022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com