2011-04-11 77 views
2

考虑下面的代码:f#中的缩进问题?

let fn() = 
    let b = 
    8. // any expression 
    -b 

let fn2() = 
    let b = 
    8. // any expression 
    - b 

“FN” 编译而 “fn2的” 不(请注意在 “b” 的前面的空间)。错误消息是:

阻止此'let'未完成。期待一个表达。

这是为什么?

回答

9

F#允许使用各种“缩排”,允许您使用较小的缩进,但仍保持在相同的表达式中。

一个这样的法律“undent”是运营商。你可以写

foo 
     |> bar 
     |> baz 

foo 
    |> bar 
    |> baz 

甚至

foo 
|> bar 
|> baz 

和缀运营商继续在随后的行同样的表情。规则是你可以“缩进”中缀运算符的长度加上一个空格“,目的是让你调整你使用的值。常见的情况是相同的编号的一个表中,像

let x = 
    42 
    + 21 
    + 62 

其中低于42的线被允许在两空间较小的缩进,使得下一数下在现有一个对准启动。

所以无论如何,这规则是踢在了这里,并没有空格,在“二进制减”优先于“一元减”,然后英寸

1

这是你的8 缩进当我输入验证码:

let fn() = 
    let b = 
     8. 
    -b 

let fn2() = 
    let b = 
     8. 
    - b 

它正确编译。发生了什么事是,在第一个例子FN2相当于:

let b = 8 - b 

和编译器需要别的东西来完成设块(我经常阅读让块为“让expr中富=酒吧”)。所以你错过了expr部分。在fn中,你得到了“让b = 8. in -b”。

let fn2() = 
    let b = 8. - b 

let块是未完成的,它需要一个返回值,例如:

+1

官方recommandation缀undent规则踢是使用4个空格的缩进,但2个空格的缩进也是可以接受的。 – Laurent 2011-04-11 13:27:25

+0

现在我完全不明白为什么你必须把“8.”在较低的“b”后面以正确翻译它。有人可以澄清这一点吗? – 2011-04-11 15:05:07

2

fn2的作为被解析。

let fn2() = 
    let b = 8. - b 
    b 

我建议你在二元运算符周围使用空格,并且在一元运算符后面没有空格。 以相同的方式,x - 2(减法)和x -2(调用带参数-2的函数x)之间存在差异。

+0

请参阅我对其他答案的评论。我不明白,在另一个答案中,你可以使用空格作为一元运算符,它会被正确翻译,在我的情况下它不会。这似乎没有任何逻辑...... – 2011-04-11 15:07:18