这个缩进工作正常:
match 5 with
| k when k < 0 ->
"value is negative"
| k -> "value is non-negative"
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)
但这不是:
match 5 with
| k when k < 0 ->
"value is negative"
| k ->
"value is non-negative"
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)
哪个F#缩进规则正在发挥作用?
这是match运营商的缩进和特殊情况的组合.
首先,下match,每种情况下的主体可以就最左的垂直线.例如,这有效:
match 5 with
| x ->
"some value"
Run Code Online (Sandbox Code Playgroud)
其次,对于出现在新行开头的运算符,有一个特殊的偏移规则:这样的运算符可以在前一行的左边,直到运算符的宽度加一.例如,这些都完全相同:
let x =
"abc"
|> printf "%s"
let y =
"abc"
|> printf "%s"
let z =
"abc"
|> printf "%s"
Run Code Online (Sandbox Code Playgroud)
因此,在您的第二个示例中,第二个案例match包括printfn行,因为正向管道运算符在第一行开头的左侧可接受的容差范围内.
如果将字符串"value is non-negative"向右移动两个空格,则正向管道将不再在公差范围内,因此该printfn行将被解释为在匹配之外.
match 5 with
| k when k < 0 ->
"value is negative"
| k ->
"value is non-negative"
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)
在您的第一个示例中,它向右移动了5个空格,因此也可以.