2013-08-31 36 views
6

我有一點麻煩聲明的int64遞減的序列。爲什麼F#編譯器與seq {0L ..- 5L ..- 10L}扭曲?

我想是這樣的:

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] 

有趣的是,如果我在..之間放置空格,它將開始使用int64太:

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

有人可以解釋爲什麼編譯器進入與seq{0L..-5L..-10L}扭曲?

回答

6

我同意這是一個有點古怪的行爲。通常建議(儘管這不是嚴格要求的規範)寫在..周圍的空間,它在這種情況下正常工作。所以,我建議使用:

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

這是爲什麼表現不同的intint64?您可能會注意到,當你寫1..-21L..-2,Visual Studio中colorizes文字不同(在第一種情況下..有顏色編號相同,在其他情況下,它的顏色..用空格相同)。

問題是,當編譯器看到1.時,它可能意味着浮點值(1.0)或它可能是1..的開始,所以這種情況是專門處理的。對於1L.,這不是一個問題 - 1L.必須的1L..開始。

所以,如果你寫1..-5..-10,編譯器使用了特殊的處理,並生成一個序列。如果你寫1L..-5..-10,那麼編譯器解析..-作爲應用於5L一元運算符。編寫空格解決了一元運算符與..後跟一個負數的不明確之處。

僅供參考,這裏是從我的Visual Studio截圖(其中綠色表示10..在黃色的第二行,但.. - 沒有特別明顯的區別,但兩者是不同:-))

enter image description here

+1

在我的Visual Studio(2012)中,我沒有得到與默認方案的顏色有任何差異。你在使用一些特殊的方案嗎? –

+0

@KomradeP。這很有可能 - 我確實改變了數字的顏色。我添加了截圖(但您可能需要縮放,顏色相似..) –