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

时间:2016-09-03 23:26:41

标签: syntax f#

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

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

阻止这样做'让'尚未完成。期待一个表达。

     

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

但是以下将编译

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

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

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

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

前两个陈述有什么区别?

1 个答案:

答案 0 :(得分:7)

当你有

 let listx2 = [1..10]

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

  

在Let或Member上下文中遇到= token之后。

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

我不太清楚为什么将|>移到行尾但只会发出警告。