2012-03-27 20 views
0

私はScala forループの暗黙的なボックスの動作を理解しようとしています。なぜ2人は最初に失敗しますが、残りは失敗しませんか?数値型の暗黙の変換のためのScalaの動作/理解?

1)失敗:

scala> for (i:Long <- 0 to 10000000L) {}

 <console>:19: error: type mismatch;<br> 
     found : Long(10000000L) 
     required: Int 
       for (i:Long <- 0 to 10000000L) {} 
           ^

2>に失敗:

scala> for (i <- 0 to 10000000L) {}

 <console>:19: error: type mismatch; 
     found : Long(10000000L) 
     required: Int 
      for (i <- 0 to 10000000L) {} 
         ^

3)動作:

scala> for (i:Long <- 0L to 10000000L) {}

4)動作:

scala> for (i <- 0L to 10000000L) {}

答えて

8

これは、forループとは何の関係もありません:

0 to 1L //error 
0 to 1 //fine 
0L to 1L //fine 
0L to 1 //fine 

Intに利用できるtoメソッドは、引数としてIntを期待するので、それはちょうどです。ですから、Longとすると、それは好きではないので、エラーが発生します。

はここRichIntに見出さto方法、の定義は次のとおり数値タイプの脱糖及び暗黙の変換が矛盾すなわちある

def to(end: Int): Range.Inclusive = Range.inclusive(self, end) 
+0

"for/comprehension"から "de-shugard"出力を生成するためにREPLまたはコンパイラにオプションがありますか? – IODEV

+0

うん、あなたは 'scalac -print'を使うことができます。 – drexin

+0

ありがとう、REPLのための同様のオプション/スイッチ? – IODEV

-3

割り当て操作に比べ「の/理解」の表現の間で異なります。他の点を証明したり、少なくとも以下の議論が間違っている点を指摘してください。

実際には、数値割り当て時に宛先タイプが支配的です。

var l:Long = 0は次のようになります。
​​

var l:Long = 0.toIntは次のようになります。
var l: Long = 0.toInt.toLong

"/理解のために、" ソースタイプが支配的である、式中、:

for (i:Long <- 0 to 1000000000L) { }は次のようになります。
0.to(1000000000L).foreach(((i: Long) =>()))

for (i <- 0L to 1000000000L) { }になる:コンパイラフラグ scala.this.Predef.longWrapper(0L).to(1000000000L).foreach[Unit](((i: Long) =>()))

(PS: "タイパー-e -Xprint" で生成された出力。 ds)

+0

この用語は "_target typing_" [Martin Oの著書 "Scala in Program" 8.4節]です。 「クロージャは、予想されるタイプ(ターゲット型指定)に応じて自動的に構築される」などの他の参照がいくつかあります。それは明らかにfor-comprehensionsには当てはまりません。すなわち、精神的モデルと論理的モデルは矛盾しています:参照: "http://stackoverflow.com/questions/9905659" – IODEV

+0

コメント理由。ありがとうございました! – IODEV