scala - 使用 scala.math.pow 折叠 List[Int] 时出现类型不匹配错误:找到 Double,需要 Int
问题描述
使用 math.pow() 时出现类型不匹配错误
@ List(1,2,3).foldLeft(1)( (x,y) => scala.math.pow(x,y) )
cmd28.sc:1: type mismatch;
found : Double
required: Int
val res28 = List(1,2,3).foldLeft(1)( (x,y) => scala.math.pow(x,y) )
^
Compilation Failed
如果我只是使用 List 的第一个 to 元素运行它,它会按预期工作。
@ scala.math.pow(1,2)
res28: Double = 1.0
此外,repl (amm) 中的函数定义表明它期待双打。
@ scala.math.pow <tab>
def pow(x: Double, y: Double): Double
那么,为什么我会收到错误消息found Double, required Int
?我试过通过双打和整数
math.scala.pow(x.toDouble, y.toDouble)
但我收到相同的错误消息。
解决方案
如果您检查类型签名,foldLeft
您可以看到它看起来像这样:
def foldLeft[B](z: B)(op: (B, A) => B): B
所以,让我们看看你在哪里称呼它:
List(1,2,3).foldLeft(1)( (x,y) => scala.math.pow(x,y) )
所以初始值是 a1
类型的Int,所以函数应该是类型(Int, Int) => Int,所以函数应该返回一个Int,但它返回一个Double。
您可以像这样修复它:(
返回一个Int)
List(1,2,3).foldLeft(1) {
case (acc, x) => math.pow(acc, x).toInt
}
或者像这样:(
返回一个Double)
List(1,2,3).foldLeft(1.0d) {
case (acc, x) => math.pow(acc, x)
}
顺便说一句,两个选项都会返回1
,因为1^x
总是返回1
;这可能不是您想要的,这可能意味着您不了解其foldLeft
工作原理。我建议您在互联网上查找有关如何从左到右应用该操作的详细说明。而且,这与Ammonite
无关。