为什么F#编译器使用seq{0L..-5L..-10L}进行扭曲?

为什么F#编译器使用seq{0L..-5L..-10L}进行扭曲?,f#,F#,我在声明int64的降序序列时遇到了一些问题 我想要的是: seq{0L..-5L..-10L};; 但是,我得到一个错误: seq{0L..-5L..-10L};; ---^^^^^^^^^^^^^^^ stdin(5,4): error FS0739: Invalid object, sequence or record expression 有趣的是,它与普通int一起工作: > seq{0..-5..-10};; val it : seq<int> = s

我在声明
int64
的降序序列时遇到了一些问题

我想要的是:

seq{0L..-5L..-10L};;
但是,我得到一个错误:

  seq{0L..-5L..-10L};;
  ---^^^^^^^^^^^^^^^

stdin(5,4): error FS0739: Invalid object, sequence or record expression
有趣的是,它与普通
int
一起工作:

> seq{0..-5..-10};;
val it : seq<int> = seq [0; -5; -10]

有人能解释一下为什么编译器会使用
seq{0L..-5L..-10L}

我同意这是一种有点奇怪的行为。通常建议(尽管规范中没有严格要求)在
周围写空格,在这种情况下它可以正常工作。因此,我建议使用:

seq { 0 .. -5 .. -10 }
seq { 0L .. -5L .. -10L }
为什么
int
int64
的行为有所不同?您可能会注意到,当您编写
1..-2
1L..-2
时,Visual Studio会以不同的方式为文本着色(在第一种情况下
与数字具有相同的颜色,在另一种情况下,它与
具有相同的颜色。
带有空格)

问题是,当编译器看到
1.
时,它可能意味着一个浮点值(
1.0
),或者它可能是
1..
的开始,因此这种情况是专门处理的。对于
1L.
,这不是问题-
1L.
必须是
1L..
的开头

因此,如果您编写
1..-5..-10
,编译器将使用特殊处理并生成一个序列。如果编写
1L..-5..-10
,编译器将
解析为应用于
5L
的一元运算符。写入空格可以解决一元运算符和
之间的歧义。
后跟负数

作为参考,这里是我的Visual Studio的一个屏幕截图(它以绿色显示
10..
,但
在第二行以黄色显示-没有特别明显的区别,但它们是不同的:-)


在我的Visual Studio(2012)中,默认方案的颜色没有任何差异。你在使用什么特殊的方案吗?@KomradeP。这很有可能——我确实改变了数字的颜色。我添加了一个屏幕截图(但您可能需要缩放,颜色相似…)
seq { 0 .. -5 .. -10 }
seq { 0L .. -5L .. -10L }