假设我想要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}}的类型?有人可以解释一下发生了什么吗?
答案 0 :(得分:11)
这只是一个优先问题。您的表达式被解释为n * (n #:: squares(n + 1))
,这显然不是很好的类型(因此错误)。
您需要添加括号:
def squares(n: Int): Stream[Int] = (n * n) #:: squares(n + 1)
顺便提一下,这不是推理问题,因为类型是已知的(即,n
已知属于Int
类型,因此不必是推断的)。