2013-08-31 13 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] 

さらに興味深いことに、 ..の間にスペースを入れると、で作業を開始しますあまりに:コンパイラがseq{0L..-5L..-10L}とツイストに入った理由

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

は、誰かが説明できますか?

答えて

6

これは少し奇妙な動作であることに同意します。 ..の周囲にスペースを書き込むことが一般的に推奨されています(ただし、これは仕様では厳密には要求されていませんが)。だから私は使用をお勧めしたい:

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

このintint64のために異なる動作をされるのはなぜ? 1..-21L..-2と書くと、Visual Studioはテキストを別々に色付けします(最初のケースでは、..は数字と同じ色を持ち、それ以外の場合は、同じ色を..としています)。

コンパイラが1.と表示される場合、浮動小数点値(1.0)を意味するか、または1..の開始点になる可能性があるため、このケースは特別に処理されます。 1L.については、これは問題ではありません。1L.1L..の先頭にする必要があります。

したがって、1..-5..-10と書くと、コンパイラは特別な処理を使用してシーケンスを生成します。 1L..-5..-10を記述すると、コンパイラは5Lに適用される単項演算子として..-を解析します。空白を書くと単項演算子と..のあいまいさが解決され、その後に負の数が続きます。

参考のために、ここに私のVisual Studioからのスクリーンショットです(黄色の2行目にある緑色で10..を示しているが、.. - 特に顕著ではない差が、彼らは異なる:-)ある)

enter image description here

+1

私のVisual Studio(2012)では、デフォルトスキームで色の違いはありません。特別な計画を使用していますか? @KomradeP。 –

+0

それはかなり可能です - 私は数字の色を変えました。スクリーンショットを追加しました(ただし、ズームする必要があるかもしれませんが、色は似ています) –

関連する問題