使用 scala foldLeft 从独特的数据结构中添加值

using scala foldLeft to add values from unique data structure

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

'unique'数据结构只是一个由operationIndex组成的,它就是两个数字和对它们执行的运算符。我制作了一个名为 numberPair 的案例类,它只包含两个数字,因为我觉得这样更容易理解。如果我错了,请纠正我,如果我应该只使用普通的一对。

scala 编译器抱怨该行 parser(data(element).numbers.number1, data(element).numbers.number2, data(element).operator)returns一个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)
    }
  }

你快到了。您的代码只需在 foldLeft 方法中将 data(element) 替换为 element 即可正常工作:

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

其实是一个小miss,你用的任何索引都需要是Int。但在您的情况下,您试图将 OperationIndex 作为索引传递给列表。 FoldLeft 负责遍历列表并一个一个地给你元素。因此,无论您尝试访问什么元素,都是元素值而不是它们的索引。

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(element.numbers.number1, element.numbers.number2, element.operator)
  }
}

computeValue(List(OperationIndex(NumberPair(10.0, 20.0), "+")))