6

の降順シーケンスを宣言するのに少し苦労してい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]

さらに興味深いことに、の間にスペースを入れると、次のようにも..機能し始め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 }

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..(緑色で表示されますが..、2 行目に黄色で表示されます - 特に目立った違いはありませんが、それらは異なります :-))

ここに画像の説明を入力

于 2013-08-31T17:57:35.867 に答える