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

Phi*_* P. 6 f#

我在宣告降序的过程中遇到了一些麻烦int64.

我想要的是这个:

seq{0L..-5L..-10L};;
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误:

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

stdin(5,4): error FS0739: Invalid object, sequence or record expression
Run Code Online (Sandbox Code Playgroud)

有趣的是,它适用于普通int:

> seq{0..-5..-10};;
val it : seq<int> = seq [0; -5; -10]
Run Code Online (Sandbox Code Playgroud)

更有趣的是,如果我在..它之间放置空格,它也开始使用int64:

> seq{0L .. -5L .. -10L};;
val it : seq<int64> = seq [0L; -5L; -10L]
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么编译器会进入扭曲状态seq{0L..-5L..-10L}吗?

Tom*_*cek 6

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

seq { 0 .. -5 .. -10 }
seq { 0L .. -5L .. -10L }
Run Code Online (Sandbox Code Playgroud)

为什么这样做intint64?您可能会注意到,当您编写1..-2并且1L..-2Visual Studio以不同方式着色文本时(在第一种情况下..颜色与数字相同,在另一种情况下,它..与空格颜色相同).

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

因此,如果编写1..-5..-10,编译器将使用特殊处理并生成序列.如果编写1L..-5..-10,则编译器将解析..-为应用于的一元运算符5L.编写空格可以解决一元运算符之间的模糊性,..然后是负数.

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

在此输入图像描述