轻量级语法和嵌套记录

时间:2014-03-08 07:55:24

标签: f# mono nested record

这个程序:

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)处开始的上下文越位。尝试进一步缩进此标记或使用标准格式约定。

  1. 为什么会出现此警告? f#-spec p. 228让我认为'{'后面的标记'a'设置了一个新的越位线,在这种情况下应该没有问题?

  2. 为什么会出现两次?

  3. 谢谢,

    索伦

    完整输出:

    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 > 
    

3 个答案:

答案 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)

规格说:

其他结构化构造也会在以下地方引入越位线:

  • a(,{或开头令牌。
  • 的第一个标记的列

为什么你决定在之后由标记引入越位线{当规则说它应该是{本身?

注意:我同意短语“令牌的第一个令牌”听起来令人困惑。更可能的是它应该是“令牌的第一个字符”,因为这适用于开始\结束案例(越位行由'b'字符列引入)

begin
 begin
end // possible incorrect indentation: this token is offside of the context started at (2,2)
end

对同一位置发出两个警告看起来像一个错误。