使用 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), "+")))
我正在尝试通过制作计算器来学习 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), "+")))