1

Stream正方形が欲しいとしましょう。それを宣言する簡単な方法は次のとおりです。

scala> def squares(n: Int): Stream[Int] = n * n #:: squares(n + 1)

ただし、そうすると、エラーが発生します。

<console>:8: error: overloaded method value * with alternatives:
  (x: Double)Double <and>
  (x: Float)Float <and>
  (x: Long)Long <and>
  (x: Int)Int <and>
  (x: Char)Int <and>
  (x: Short)Int <and>
  (x: Byte)Int
 cannot be applied to (scala.collection.immutable.Stream[Int])
       def squares(n: Int): Stream[Int] = n * n #:: squares(n + 1)
                                            ^

では、なぜScalaはそのタイプnが明らかにであるかを推測できないのIntでしょうか?誰かが何が起こっているのか説明してもらえますか?

4

1 に答える 1

11

これは単なる優先順位の問題です。あなたの式はとして解釈されてn * (n #:: squares(n + 1))いますが、これは明らかに適切に型指定されていません(したがってエラーです)。

括弧を追加する必要があります:

def squares(n: Int): Stream[Int] = (n * n) #:: squares(n + 1)

ちなみに、これは推論nの問題ではありません。タイプがわかっているためです(つまり、タイプがわかっているので、推論Intする必要はありません)。

于 2012-11-25T16:37:47.440 に答える