垂直条之间的F#表达式
在下面的F#指南页面上,我看到了以下内容: “…计算表达式的主体,此处表示为垂直条之间的F#表达式,f#,F#,在下面的F#指南页面上,我看到了以下内容: “…计算表达式的主体,此处表示为 {| cexpr |} ,翻译成……” 为什么cexpr介于两个竖线字符之间 这些竖线字符在本文中是什么意思?涉及{cexpr}的符号不用于表示计算表达式的语法,而是表示用于使用计算表达式生成器将计算表达式内的代码转换为方法调用的转换规则 我同意这有点混乱,因为计算表达式的语法是bldr{cexpr},其中bldr是一些计算生成器,cexpr是计算表达式体-但是{124;…}语法与此无关 例如,考虑前两个规则: {
{| cexpr |}
,翻译成……”
为什么cexpr介于两个竖线字符之间
这些竖线字符在本文中是什么意思?涉及
{cexpr}
的符号不用于表示计算表达式的语法,而是表示用于使用计算表达式生成器将计算表达式内的代码转换为方法调用的转换规则
我同意这有点混乱,因为计算表达式的语法是bldr{cexpr}
,其中bldr
是一些计算生成器,cexpr
是计算表达式体-但是{124;…}
语法与此无关
例如,考虑前两个规则:
{| let binding in cexpr |} --> let binding in {| cexpr |}
{| let! pattern = expr in cexpr |} --> builder.Bind(expr, (fun pattern -> {| cexpr |}))
这只是说cexpr中的计算表达式let binding
变成了让{| cexpr |}
中的绑定其中{| cexpr |}
意味着我们需要递归地转换计算表达式的其余部分。在第二种情况下,如果我们想翻译一个计算表达式{let!pattern=expr In cexpr}
,我们将生成一个方法调用Bind
方法:builder.Bind(expr,(fun pattern->{cexpr}))
,然后,我们再次递归地将翻译应用到cexpr
后面的let
并将结果放入lambda函数体中
将{| | |}
视为一个函数TRANSLATE(…)
,可能会有所帮助,但这有点令人困惑,因为该函数是在语法结构上运行的,即:
TRANSLATE(let! pattern = expr in cexpr) =
builder.Bind(expr, (fun pattern -> TRANSLATE(cexpr) ))
它们只是用来界定表达式的主体。嗯,doc的符号很混乱。查看真实的代码示例,了解如何使用这些代码。