F# if-else表达式未考虑后的缩进更改?

F# if-else表达式未考虑后的缩进更改?,f#,F#,鉴于此,该操作员可用于评估管道中的副作用 let inline (|>!) a f = f a ; a 这个代码片段 if 1 = 1 then "same" else "different" |>! printfn "The numbers are %s." |> printfn "Yes, they are %s." 这不会打印数字相同的,但会打印是的,它们

鉴于此,该操作员可用于评估管道中的副作用

let inline (|>!) a f = f a ; a 
这个代码片段

if 1 = 1 then  
    "same"
else 
    "different"  
|>! printfn "The numbers are %s." 
|>  printfn "Yes, they are %s." 
这不会打印数字相同的
,但会打印
是的,它们是相同的

为什么副作用运算符是
|>在此处被忽略,但考虑了
,尽管缩进相同?

我是否必须以不同的方式定义副作用运算符?

像这样写它的工作预期

if 1 = 1 then   "same"
else "different"  
|>! printfn "The numbers are %s." 
|>  printfn "Yes, they are %s." 
对我来说,代码的实际行为就像是编写的一样,这是唯一不直观的吗

if 1 = 1 then  
    "same"
else 
    "different"  
    |>! printfn "The numbers are %s." // with indent here
|>  printfn "Yes, they are %s." 

这不是一个bug,也不是专门针对长度超过两个字符的运算符发生的。这是F#的允许补偿规则的有趣结果

当对齐相同嵌套级别的线时,它们必须位于相同的缩进处,如下所示:

let foo =
     bar
     baz
     qux
但这是不允许的:

let foo =
     bar
      baz  // Indented too much to the left
     qux
这也不是:

let foo =
     bar
    baz  // Indented too little
     qux
当处理创建嵌套块的构造时,例如
如果
/
那么
,此规则用于确定块何时结束:缩进对齐何时中断

let x =
     if 1 = 1 then
       bar
       baz
     qux
但这条规则有一个例外:如果行以运算符开头,则允许它向左移动最多运算符大小加1个字符,并且它仍将被视为处于“当前”缩进

例如,这项工作:

let x =
       1
     + 2
     + 3
let x =
       1
     + 2
     + 3
    <> 6
但是当你有不同大小的操作符时,它会变得很棘手。这项工作:

let x =
       1
     + 2
     + 3
let x =
       1
     + 2
     + 3
    <> 6
让x=
1.
+ 2
+ 3
6.
但这并不是:

let x =
        1
     +  2
     +  3
     <> 6
让x=
1.
+  2
+  3
6.

有趣。这可能是被定义的行为,但对我来说似乎不直观。我很乐意让我的操作员在左侧排队(就像惯用的多线F#piping一样)。操作员“取消登录”的功能似乎没有什么用处。我从来没有这样做过。我认为已经有人建议对此添加警告: