考虑下面的代码:f#中的缩进问题?
let fn() =
let b =
8. // any expression
-b
let fn2() =
let b =
8. // any expression
- b
“FN” 编译而 “fn2的” 不(请注意在 “b” 的前面的空间)。错误消息是:
阻止此'let'未完成。期待一个表达。
这是为什么?
考虑下面的代码:f#中的缩进问题?
let fn() =
let b =
8. // any expression
-b
let fn2() =
let b =
8. // any expression
- b
“FN” 编译而 “fn2的” 不(请注意在 “b” 的前面的空间)。错误消息是:
阻止此'let'未完成。期待一个表达。
这是为什么?
F#允许使用各种“缩排”,允许您使用较小的缩进,但仍保持在相同的表达式中。
一个这样的法律“undent”是运营商。你可以写
foo
|> bar
|> baz
或
foo
|> bar
|> baz
甚至
foo
|> bar
|> baz
和缀运营商继续在随后的行同样的表情。规则是你可以“缩进”中缀运算符的长度加上一个空格“,目的是让你调整你使用的值。常见的情况是相同的编号的一个表中,像
let x =
42
+ 21
+ 62
其中低于42的线被允许在两空间较小的缩进,使得下一数下在现有一个对准启动。
所以无论如何,这规则是踢在了这里,并没有空格,在“二进制减”优先于“一元减”,然后英寸
这是你的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
块是未完成的,它需要一个返回值,例如:
fn2的作为被解析。
let fn2() =
let b = 8. - b
b
我建议你在二元运算符周围使用空格,并且在一元运算符后面没有空格。 以相同的方式,x - 2
(减法)和x -2
(调用带参数-2的函数x)之间存在差异。
请参阅我对其他答案的评论。我不明白,在另一个答案中,你可以使用空格作为一元运算符,它会被正确翻译,在我的情况下它不会。这似乎没有任何逻辑...... – 2011-04-11 15:07:18
官方recommandation缀undent规则踢是使用4个空格的缩进,但2个空格的缩进也是可以接受的。 – Laurent 2011-04-11 13:27:25
现在我完全不明白为什么你必须把“8.”在较低的“b”后面以正确翻译它。有人可以澄清这一点吗? – 2011-04-11 15:05:07