垂直条之间的F#表达式

时间:2018-05-26 10:29:18

标签: f#

在下面的F#指南页面上,我看到了:

" ...计算表达式的主体,此处表示为

{| cexpr |}

,被翻译成......"

https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/computation-expressions

为什么cexpr介于2个垂直条字符之间?

在这种情况下,这些竖线字符的含义是什么?

1 个答案:

答案 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!可能会有所帮助,但它有点令人困惑,因为函数在句法结构上运行,即:

{| .. |}