为什么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
类型,因此不需要推断)