为什么Scala编译器不能推断Stream类型的操作?

时间:2012-11-25 16:34:16

标签: scala stream

假设我想要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的{​​{1}}的类型?有人可以解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:11)

这只是一个优先问题。您的表达式被解释为n * (n #:: squares(n + 1)),这显然不是很好的类型(因此错误)。

您需要添加括号:

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

顺便提一下,这不是推理问题,因为类型是已知的(即,n已知属于Int类型,因此不必是推断的)。