在下面的F#指南页面上,我看到了:
" ...计算表达式的主体,此处表示为
{| cexpr |}
,被翻译成......"
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/computation-expressions
为什么cexpr介于2个垂直条字符之间?
在这种情况下,这些竖线字符的含义是什么?
答案 0 :(得分:1)
涉及{| cexpr |}
的表示法不是用来表示计算表达式的语法,而是用来表示用于翻译内部代码的翻译规则。使用计算表达式构建器计算表达式到方法调用。
我同意这有点令人困惑,因为计算表达式的语法是bldr { cexpr }
,其中bldr
是一些计算构建器而cexpr
是计算表达式主体 - 但是{{1语法与此无关。
例如,考虑前两个规则:
{| ... |}
这只是表示计算表达式{| let binding in cexpr |} --> let binding in {| cexpr |}
{| let! pattern = expr in cexpr |} --> builder.Bind(expr, (fun pattern -> {| cexpr |}))
变为
let binding in cexpr
其中let binding in {| cexpr |}
表示我们需要递归转换计算表达式的其余部分。在第二种情况下,如果我们想要翻译计算表达式{| cexpr |}
,我们生成对{| let! pattern = expr in cexpr |}
方法的方法调用:Bind
并再次,我们递归地将翻译应用于{{ 1}}在builder.Bind(expr, (fun pattern -> {| cexpr |}))
之后,并将结果放在lambda函数体中。
将cexpr
视为函数let!
可能会有所帮助,但它有点令人困惑,因为函数在句法结构上运行,即:
{| .. |}