簡體   English   中英

使用 scala.math.pow 折疊 List[Int] 時出現類型不匹配錯誤:找到 Double,需要 Int

[英]Type mismatch error when folding a List[Int] with scala.math.pow: found Double, required 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) 中的 function 定義表明它期待雙倍。

@ 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) )

所以初始值是Int類型的1 ,所以 function 應該是(Int, Int) => Int類型,所以 function 應該返回一個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無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM