为什么我可以把|>在下一行,但< |给出语法错误?

时间:2011-05-15 23:55:18

标签: f# syntax-error

我可以这样做:

let foo = bar
    |> baz

但是当我这样做时出现语法错误:

let foo = bar
    <| baz

为什么?

当我定义自己的中缀运算符并尝试以这种方式使用它时,我也会遇到语法错误。

2 个答案:

答案 0 :(得分:5)

除非我遗漏了某些内容,否则两个运营商(以及任何其他中缀运营商)的行为相同。当我定义barbaz并使用您的示例时,我在两种情况下都会出错。 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 ]

所以我的误解是空白无关紧要,只要它比前面的线更进一步缩进。事实并非如此。