首页 > 解决方案 > 使用 scala foldLeft 添加来自唯一数据结构的值

问题描述

我正在尝试通过制作计算器来学习 Scala。在这个计算器中,我特别有两种方法可以进行解析和计算。我还有两个处理数据的案例类。

“唯一”数据结构只是由一个 operationIndex 组成,它只是两个数字和对它们执行的运算符。我创建了一个名为 numberPair 的案例类,它只包含两个数字,因为我觉得这种方式更容易理解。如果我在这方面错了,请纠正我,如果我应该只使用正常的一对。

scala 编译器抱怨该行 parser(data(element).numbers.number1, data(element).numbers.number2, data(element).operator)返回 Calculator.OperationIndex。我不明白,它应该返回函数签名指定的双精度值。它还说它需要一个 Int 超过一个 double 。我已经阅读了 scala 文档,但我仍然不确定我哪里出错了。

case class NumberPair(number1: Double, number2: Double)
case class OperationIndex(numbers: NumberPair, operator: String)

def parser(number1: Double, number2: Double, operator: String): Double = {
    val result = operator match {
      case "+" => number1 + number2
      case "-" => number1 - number2
      case "/" => number1 / number2
      case "*" => number1 * number2
    }
    result
  }

def computeValue(data: List[OperationIndex]): Double = {
    data.foldLeft(0.0) {
      (acc: Double, element: OperationIndex) =>
        acc + parser(data(element).numbers.number1, data(element).numbers.number2, data(element).operator)
    }
  }

标签: scalascala-collectionsfoldfoldleft

解决方案


您快到了。只需在您的方法中替换为,您的代码就可以正常工作data(element)elementfoldLeft

def computeValue(data: List[OperationIndex]): Double = {
    data.foldLeft(0.0) {
      (acc: Double, element: OperationIndex) =>
        acc + parser(element.numbers.number1, element.numbers.number2, element.operator)
    }
  }

推荐阅读