这个程序:
type A = { a : int }
type B = { b : A }
//34567890
let r = {
b = { // line 6
a = 2 // line 7
}
}
在mono / fsharpc下生成此警告两次:
/Users/debois/git/dcr/foo.fs(7,5):警告FS0058:可能不正确的缩进:此标记在位置(6:7)处开始的上下文越位。尝试进一步缩进此标记或使用标准格式约定。
为什么会出现此警告? f#-spec p. 228让我认为'{'后面的标记'a'设置了一个新的越位线,在这种情况下应该没有问题?
为什么会出现两次?
谢谢,
索伦
完整输出:
dcr > fsharpc foo.fs
F# Compiler for F# 3.0 (Open Source Edition)
Freely distributed under the Apache 2.0 Open Source License
/Users/debois/git/dcr/foo.fs(7,5): warning FS0058: Possible incorrect indentation: this token is offside of context started at position (6:7). Try indenting this token further or using standard formatting conventions.
/Users/debois/git/dcr/foo.fs(7,5): warning FS0058: Possible incorrect indentation: this token is offside of context started at position (6:7). Try indenting this token further or using standard formatting conventions.
dcr >
答案 0 :(得分:3)
将代码重新格式化为
type A = { a : int }
type B = { b : A }
//34567890
let r = { b = { a = 2 } }
或
let r =
{
b = { a = 2 }
}
即。 {
是最左边的标记。
编辑:一个场外线以{
开头,因此您需要缩进至少与{
换行符之后的缩进非强制性。第二个警告也是出于同样的原因。
答案 1 :(得分:3)
我终于解决了。从F# spec第229-230页开始,以下是关于何时引入越位背景(线)的相关规则(规则编号是我的):
(i)a的第一个标记的列(,{或开始标记。
(ii)在记录表达式中遇到= token之后,当后续令牌(a)出现在下一行或(b)是try,match,if,let,for,while或use之一时
现在回想一下这个问题:
//34567890
let r = {
b = { // line 6
a = 2 // line 7
}
}
第6行的b
跟在{
之后,因此第3列推出了第(i)行的越位线。然后,第6行的{
跟随记录表达式=
,因此在第7列推出新的越位线(ii)。第7行第5列的a
违反了越线。
棘手的一点是第5行的{
使 next 标记定义了一个越位线,而第6行的{
是本身< / em>越位线(因为它遵循记录表达式等号)。
答案 2 :(得分:0)
规格说:
其他结构化构造也会在以下地方引入越位线:
为什么你决定在之后由标记引入越位线{当规则说它应该是{本身?
注意:我同意短语“令牌的第一个令牌”听起来令人困惑。更可能的是它应该是“令牌的第一个字符”,因为这适用于开始\结束案例(越位行由'b'字符列引入)
begin
begin
end // possible incorrect indentation: this token is offside of the context started at (2,2)
end
对同一位置发出两个警告看起来像一个错误。