F#中的行长限制 - 错误还是功能?

时间:2010-11-26 13:23:01

标签: f#

此代码在VS 2010的错误列表中显示错误:

let (a: float), (b: float), (c: int), (d: float), (e: float), (f: float), (g: float), (h: float), (i: float), (j: float), (k: float), (l: float), (abcdefghijklmnopqrstabcdefghijklmnopqrstabc: float ) = 0., 0., 0, 0., 0., 0., [], 0., 0., 0., 0., 0., 0., 0.

将一个字符添加到最后一个变量

let (a: float), (b: float), (c: int), (d: float), (e: float), (f: float), (g: float), (h: float), (i: float), (j: float), (k: float), (l: float), (abcdefghijklmnopqrstabcdefghijklmnopqrstabcd: float ) = 0., 0., 0, 0., 0., 0., [], 0., 0., 0., 0., 0., 0., 0.

导致错误列表中没有错误。

我在很多方面遇到过这样的行为,但总是只有长队。这是F#的一个特性还是一个bug?

Oldrich

3 个答案:

答案 0 :(得分:4)

Visual Studio F#支持无法在列255之后执行错误和曲折。如果您查看编译器源中的F#range类型,您可能会开始收集原因(尽管我认为它应该去至少511个字符);我不记得现在100%确定这个限制的确切位置。

(顺便说一句,我只知道这一点,因为我最近碰到了它,请参阅

上的评论

https://github.com/brianmcn/FSharpDepthColorizer/blob/master/ParseTreeDepth/MyFSParser/MyParsing.fs

第267行。)

答案 1 :(得分:3)

我正在使用带有11月CTP的VS2010 shell(不确定这个新的CTP是针对.NET 2.0还是.NET 4.0构建的)

我已经在各种场景中测试过这段代码,这里有点奇怪的事情。但肯定没有“功能”在这里工作,因为@Mauricio指出,这两个let-bindings都不正确。

互动

两者都给出(几乎)正确的输出错误:

  

期待一个       float * float * int * float * float * float * float * float * float   * float * float * float * float但给出了一个       float * float * int * float * float * float * float * float * float   * float * float * float * float *'a元组的长度不同   13和14

请注意错误的“给定”部分是错误的。

VS编辑器中的即时错误检测

在这里,我看到的行为与您描述的行为类似:我创建了两个文件Program.fs和Program2.fs,顶级模块test1test2分别包含您的第一个和第二个示例。我得到了一个红色的squigly(sp?)与我们在FSI中的第一个相同的错误信息,但是第二个没有红色的错误(并且通过在第二个中切换'd'字符我能够诱导红色-squigly)。

编译

在上一个示例中尝试构建项目时,我遇到了两个let-bindings的构建错误(与我们通过FSI看到的相同)。

结论

所以看起来好像有两个错误(因为我们实际上无法构建项目,因此很小):

  1. 错误消息不正确
  2. 编辑器内错误检测不一致

答案 2 :(得分:0)

Visual Studio根据F#编译器(fsc.exe)返回的位置信息提供红色波形和错误导航。不幸的是,从VS2010 SP1开始,F#编译器不提供极右列错误的位置信息。您可以在Visual Studio输出窗口中看到这一点。通常会出现错误:

  

File.fs(60,213):错误FS0001:此表达式是预期的......

如果列不是213,而是更大的东西(我认为大于255),则会报告错误(并且您可以快乐地找到它):

  

File.fs:错误FS0001:此表达式是预期的......