哪个与缩进规则匹配在这里?

Rob*_*sen 6 f# indentation

这个缩进工作正常:

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#缩进规则正在发挥作用?

Fyo*_*kin 6

这是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个空格,因此也可以.

  • 这是偶然地通过4个空格缩进的一个很好的论据:因为缩进2个空格通常会遇到这个问题,但是如果下一行的运算符至少有三个字符,则缩进4个空格只会遇到这个问题长,例如`> =>`.并不是说4空间缩进将完全没有问题:毕竟像`> =>`和`>> =`这样的运算符是常用的.但它们远不如`|>`那么常见,这会导致2空间缩进问题但不会导致4. (6认同)