首页 > 解决方案 > 使用 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) 

但我收到相同的错误消息。

标签: scala

解决方案


如果您检查类型签名,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
无关。


推荐阅读