请考虑以下代码:
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'之后的块未完成.期待一个表达.
这是为什么?
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以下的行以两个较小的缩进开始,以便下一个数字在前一个数字下对齐.
所以无论如何,这个规则在这里踢,并且没有空格,'二进制减去'优先于'一元减',然后中缀不足规则开始.