我可以这样做:
let foo = bar
|> baz
但是当我这样做时出现语法错误:
let foo = bar
<| baz
为什么?
当我定义自己的中缀运算符并尝试以这种方式使用它时,我也会遇到语法错误。
答案 0 :(得分:5)
除非我遗漏了某些内容,否则两个运营商(以及任何其他中缀运营商)的行为相同。当我定义bar
和baz
并使用您的示例时,我在两种情况下都会出错。 F#中的off-side规则允许你在距离左边较远的位置缩进运算符,但参数列必须匹配:
let bar = 1
let baz x = x + 1
let foo1 = bar
|> baz
let foo2 = baz
<| bar
这两个都会给出错误消息:
let foo1 = bar
|> baz
let foo2 = baz
<| bar
(虽然您可能只看到第一个错误,因为F#编译器在语法错误后停止报告其他错误 - 可能是因为它无法保证它们是合理的)
在MSDN上的Code Formatting Guidelines中已经很好地描述了这些规则。
答案 1 :(得分:0)
我没有发现缩进错误,因为以下两个都有效:
match r.IsDBNull index with
| true -> None
| _ -> r.GetValue index
:?> 'a
|> Some
let param p =
db.CreateParameter p
|> cmd.Parameters.Add
|> ignore
即使我只打了一次tab。然而,我在这里点击了一次,它没有正确缩进:
let foo2 = proc "getfoo2"
<| [ "x",Int32,In;
"y",String(15),In ]
它应该是两者之一:
let foo2 = proc "getfoo2"
<| [ "x",Int32,In;
"y",String(15),In ]
let foo2 =
proc "getfoo2"
<| [ "x",Int32,In;
"y",String(15),In ]
所以我的误解是空白无关紧要,只要它比前面的线更进一步缩进。事实并非如此。