0

我正在尝试通过制作计算器来学习 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)
    }
  }
4

2 回答 2

3

您快到了。只需在您的方法中替换为,您的代码就可以正常工作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)
    }
  }
于 2018-07-04T01:48:29.220 回答
2

这实际上是一个小失误,您使用的任何索引都必须是 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), "+")))
于 2018-07-04T02:43:28.123 回答