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一样)。操作员“取消登录”的功能似乎没有什么用处。我从来没有这样做过。我认为已经有人建议对此添加警告: