为什么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 }