использование scala foldLeft для добавления значений из уникальной структуры данных - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь выучить Scala с помощью калькулятора. В этом калькуляторе у меня есть два метода, в частности, для анализа и вычисления. У меня также есть два класса case, которые обрабатывают данные.

«Уникальная» структура данных - это просто составленный OperationIndex, который состоит из двух чисел и оператора, выполняющего их. Я сделал caseclass под названием numberPair, который просто содержит два числа, потому что я чувствую, что это легче понять таким образом. Пожалуйста, поправьте меня, если я ошибаюсь в этом, и если я должен просто использовать нормальную пару.

Компилятор scala жалуется, что строка parser(data(element).numbers.number1, data(element).numbers.number2, data(element).operator) возвращает Calculator.OperationIndex. Я не понимаю, он должен возвращать double, как указано в сигнатуре функции. Это также говорит о том, что он требует Int над двойным. Я прочитал документацию по 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)
    }
  }

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Это небольшая ошибка, любой индекс, который вы используете, должен быть 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), "+")))
0 голосов
/ 04 июля 2018

Ты почти у цели. Ваш код будет работать нормально, просто заменив data(element) на element в вашем foldLeft методе:

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