繁体   English   中英

FoldLeft操作中的Scala类型不匹配

[英]Scala Type Mismatch in FoldLeft operation

我对Scala还是很陌生,因此请原谅这可能是对该语言的简单误解。 我有一个功能:

def compareNextElemToMinElem(lst: List[Int]) = {
    val max = lst.foldLeft((lst(0),lst(0),0)) { (minSoFar:Int, x:Int, maxDiff:Int) => 
        if (x < minSoFar) (minSoFar, x, maxDiff) 
        if (x - minSoFar > maxDiff) (minSoFar, x, x - minSoFar)
        else (minSoFar, x, x - minSoFar)
    }
    max._3
}

基本上,它应该一次只包含一个元素,并跟踪迄今为止最大的元素差异。 通过调用max._3我希望回到最终maxDiff从foldLeft电话。 我收到一个错误:

type mismatch;
 found   : (Int, Int, Int) => (Int, Int, Int)
 required: ((Int, Int, Int), Int) => (Int, Int, Int)
    val max = lst.foldLeft((lst(0),lst(0),0)) { (minSoFar:Int, x:Int, maxDiff:Int) => 

另外,我必须放置(minSoFar:Int, x:Int, maxDiff:Int)而不是(minSoFar, x, maxDiff)以避免missing parameter type错误。 这是为什么?

语法和逻辑似乎都不完全正确,这是一个可能的解决方法:

def compareNextElemToMinElem(lst: List[Int]) = {
  lst.foldLeft((lst.head, lst.head)) { case ((minSoFar, maxDiff), x) =>
    if (x < minSoFar) (x, maxDiff) 
    else if (x - minSoFar > maxDiff) (minSoFar, x - minSoFar)
    else (minSoFar, maxDiff)
  }._2
}

println(compareNextElemToMinElem(List(1,-2,3,-1,4,8,2)))

版画

10

这是8 - (-2)

简要说明:

  1. 您想跟踪两个值: minSoFarmaxDiff ,而不是三个。
  2. 您必须查看列表的内容: x必须来自列表,而不是来自上一步传递的“累加器”
  3. 通常, fold具有一个带有两个参数的函数:

     list.fold(accumulator0){ (acc, currentValue) => nextAcc } 
  4. 由于这里的累加器acc本身就是一个元组,因此必须在第一个组件上使用case进行模式匹配,因此:

     list.fold((a0, b0)) { case ((ai, bi), x) => (nextAi, nextBi) } 
  5. 我不了解您的if-else逻辑,无法保证它能达到您的预期。

您必须将minSofar和maxDiff传递为Tuple2或pair.So应该类似于以下代码:

def compareNextElemToMinElem(lst: List[Int]) = {
    val max = lst.foldLeft((lst(0),0)) { (p : Tuple2[Int,Int], x:Int) =>
      var minSoFar = p._1;
      var maxDiff = p._2
      if (x < minSoFar) {
        maxDiff = maxDiff + minSoFar - x
        minSoFar = x
      }
      if (x - minSoFar > maxDiff){
        maxDiff = x - minSoFar
      }
      (minSoFar,maxDiff)
    }
    max._2
  } 

点击此链接可了解有关foldleft参数的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM