为什么将表达式的第一行放在同一行上,不要编译?

Dan*_*tle 7 syntax f#

在F#中,以下语句将失败,并显示以下错误

let listx2 = [1..10]
    |> List.map(fun x -> x * 2)
    |> List.iter (fun x -> printf "%d " x)
Run Code Online (Sandbox Code Playgroud)

这个'let'之后的块未完成.期待一个表达.

绑定中出现意外的中缀操作符.在此点或其他标记之前或之前的预期不完整结构化构造.

但是以下将编译

let listx2 = 
    [1..10]
    |> List.map(fun x -> x * 2)
    |> List.iter (fun x -> printf "%d " x)
Run Code Online (Sandbox Code Playgroud)

我也注意到这个编译但有警告

let listx2 = [1..10] |>
    List.map(fun x -> x * 2) |>
    List.iter (fun x -> printf "%d " x)
Run Code Online (Sandbox Code Playgroud)

可能的错误缩进:此标记在位置(10:18)处开始的上下文越位.尝试进一步缩进此标记或使用标准格式约定.

前两个陈述有什么区别?

Joh*_*mer 7

当你有

 let listx2 = [1..10]
Run Code Online (Sandbox Code Playgroud)

您隐式将下一行的缩进级别设置为与该字符相同的字符[.对于规范中越位字符的以下规则给出:

在Let或Member上下文中遇到= token后立即执行.

所以在第一个例子中,|>缩进的次数少于[你得到的错误,但在第二个例子中它们是相同的,所以一切正常.

我不太确定为什么移动|>到行的末尾只会发出警告.