6

我在声明int64.

我想要的是这样的:

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

但是,我收到一个错误:

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

stdin(5,4): error FS0739: Invalid object, sequence or record expression

有趣的是,它适用于 plain int

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

更有趣的是,如果我在 之间放置空格..,它也会开始工作int64

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

有人可以解释为什么编译器会陷入困境seq{0L..-5L..-10L}吗?

4

1 回答 1

6

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

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

为什么这对intand表现不同int64?您可能会注意到,当您编写1..-2and时1L..-2,Visual Studio 会以不同的方式对文本着色(在第一种情况下,它与数字具有相同的颜色,在另一种情况下,它与空格..具有相同的颜色)。..

问题是当编译器看到 时,它可能1.表示一个浮点值(因为,这不是问题——必须是开始。1.01..1L.1L.1L..

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

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

在此处输入图像描述

于 2013-08-31T17:57:35.867 回答