f#中的缩进错误?

Old*_*vec 2 f# indentation

请考虑以下代码:

let fn () =
  let b =
    8. // any expression
  -b

let fn2 () =
  let b =
    8. // any expression
  - b
Run Code Online (Sandbox Code Playgroud)

"fn"编译而"fn2"不编译(注意"b"前面的空格).错误消息是:

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

这是为什么?

Bri*_*ian 9

F#允许各种"undentation",允许你使用较小的缩进,但仍然保持在同一个表达式中.

一个这样的合法"不作为"是运营商.你可以写

    foo
        |> bar
        |> baz
Run Code Online (Sandbox Code Playgroud)

要么

    foo
    |> bar
    |> baz
Run Code Online (Sandbox Code Playgroud)

甚至

    foo
 |> bar
 |> baz
Run Code Online (Sandbox Code Playgroud)

中缀运算符在后续行上继续使用相同的表达式.规则是允许您"取消""中缀运算符的长度加上一个空格",意图是允许您对齐您正在使用的值.一个常见的情况就像数字表一样

let x = 
    42
  + 21
  + 62
Run Code Online (Sandbox Code Playgroud)

允许42以下的行以两个较小的缩进开始,以便下一个数字在前一个数字下对齐.

所以无论如何,这个规则在这里踢,并且没有空格,'二进制减去'优先于'一元减',然后中缀不足规则开始.