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

为什么Scala编译器不能推断流类型操作?,scala,stream,Scala,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: Lo

假设我想要一个正方形的
流。一种简单的声明方法是:

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)
                                            ^
:8:错误:重载的方法值*带有替代项:
双倍
(x:浮动)浮动
(十:长)长
(x:Int)Int
(x:Char)Int
(x:Short)Int
(x:Byte)Int
无法应用于(scala.collection.immutable.Stream[Int])
def squares(n:Int):流[Int]=n*n#:::squares(n+1)
^

那么,为什么Scala不能推断出
n
的类型,这显然是
Int
?有人能解释一下发生了什么事吗?

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

您需要添加括号:

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

顺便说一句,这不是一个推断问题,因为类型是已知的(即,
n
已知为
Int
类型,因此不需要进行推断)。

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

您需要添加括号:

def squares(n: Int): Stream[Int] = (n * n) #:: squares(n + 1)
顺便说一句,这不是一个推断问题,因为类型是已知的(即,
n
已知为
Int
类型,因此不需要推断)