0

I am trying to learn Scala through making a Calculator. In this calculator, I have two methods in particular that do the parsing and computing. I also have two case classes that handle data.

The 'unique' data structure is just a composed of an operationIndex, which is just the two numbers and the operator to perform on them. I made a caseclass called numberPair that just holds the two numbers because I feel like it is easier to comprehend this way. Please correct me if I am wrong on this, and if i should just use a normal pair.

The scala compiler is complaining that the line parser(data(element).numbers.number1, data(element).numbers.number2, data(element).operator) returns a Calculator.OperationIndex. I don't get it, it's supposed to be returning a double as specified by the function signature. It's also saying that it requires an Int over a double. I've read the scala documentation, but i'm still not sure where I've went wrong.

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)
    }
  }
BodyBingers
  • 65
  • 3
  • 9
  • 1
    What is `data(element)` supposed to return? `data` is defined as a `List` therefore `data(x)` is short for `data.apply(x)` which means that `x` can only be an `Int` but `element` is not an `Int`. – jwvh Jul 04 '18 at 00:18
  • I figured that data(x) would be equivalent to accessing an array at a particular index. Thank you for catching that. – BodyBingers Jul 04 '18 at 01:45

2 Answers2

3

You're almost there. Your code will work fine by simply replacing data(element) with element in your foldLeft method:

def computeValue(data: List[OperationIndex]): Double = {
    data.foldLeft(0.0) {
      (acc: Double, element: OperationIndex) =>
        acc + parser(element.numbers.number1, element.numbers.number2, element.operator)
    }
  }
Leo C
  • 22,006
  • 3
  • 26
  • 39
2

It's actually a small miss, any index you use need to be Int. But in your case you were trying to pass OperationIndex as an index to the list. FoldLeft takes the responsibility of traversing the list and giving you element one by one. So the element whatever you are trying to access is the element value and not their indexes.

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), "+")))
Shankar Shastri
  • 1,134
  • 11
  • 18