Scala 集合总和以处理重载加法
Scala collection sum to work with overloaded addition
我正在尝试使重载的加法运算符与集合的 sum
方法一起使用。例如,对于
final case class Probability(val value: Double) {
def +(that: Probability): Probability =
Probability(this.value + that.value)
}
List(Probability(0.4), Probability(0.3)).sum
我收到以下错误消息:
Error:(6, 109) could not find implicit value for parameter num:
Numeric[A$A42.this.Probability]
def get$$instance$$res0 = /* ###worksheet### generated $$end$$ */
List(Probability(0.4), Probability(0.3)).sum;}
Error:(6, 109) not enough arguments for method sum:
(implicit num: Numeric[A$A42.this.Probability])A$A42.this.Probability.
Unspecified value parameter num.
def get$$instance$$res0 = /* ###worksheet### generated $$end$$ */
List(Probability(0.4), Probability(0.3)).sum;}
我认为这与 implicit
s 相关(正如错误消息明确指出的那样),但我不知道应该在哪里定义或添加它(在 class 的情况下) Probability
,它的伴生对象,或者在 sum
? 之后,或者它应该是什么样子。
Sum 方法适用于 class Numeric[T] 类型,因此如果您想在自己的 "number type" 上调用 sum,则需要定义 Numeric[Probability] 的实例。
放置自定义类型 class 定义的最佳位置是对象伴侣。
object Probability {
implicit val probabilityNumberic = new Numeric[Probability] {
def plus(x: Probability, y: Probability): Probability = ???
def minus(x: Probability, y: Probability): Probability = ???
def times(x: Probability, y: Probability): Probability = ???
def negate(x: Probability): Probability = ???
def fromInt(x: Int): Probability = ???
def toInt(x: Probability): Int = ???
def toLong(x: Probability): Long = ???
def toFloat(x: Probability): Float = ???
def toDouble(x: Probability): Double = ???
def compare(x: Probability, y: Probability): Int = ???
}
}
或者,如果您不想定义 Numeric[T] 实例,或者如果您想要 Probability 作为结果,您可以使用 reduce 而不是 sum。
List(Probability(0.4), Probability(0.3)).reduce(_ + _)
或 reduceOption 如果列表可能为空。
关于你可以在哪里定义你的Numeric[Probability]
,你必须考虑隐含的scope.It是常见的定义对象伴侣的默认实现,但你可以在求和调用之前创建它,通过导入,或者您可以显式使用它。这取决于你需要什么。
我正在尝试使重载的加法运算符与集合的 sum
方法一起使用。例如,对于
final case class Probability(val value: Double) {
def +(that: Probability): Probability =
Probability(this.value + that.value)
}
List(Probability(0.4), Probability(0.3)).sum
我收到以下错误消息:
Error:(6, 109) could not find implicit value for parameter num:
Numeric[A$A42.this.Probability]
def get$$instance$$res0 = /* ###worksheet### generated $$end$$ */
List(Probability(0.4), Probability(0.3)).sum;}
Error:(6, 109) not enough arguments for method sum:
(implicit num: Numeric[A$A42.this.Probability])A$A42.this.Probability.
Unspecified value parameter num.
def get$$instance$$res0 = /* ###worksheet### generated $$end$$ */
List(Probability(0.4), Probability(0.3)).sum;}
我认为这与 implicit
s 相关(正如错误消息明确指出的那样),但我不知道应该在哪里定义或添加它(在 class 的情况下) Probability
,它的伴生对象,或者在 sum
? 之后,或者它应该是什么样子。
Sum 方法适用于 class Numeric[T] 类型,因此如果您想在自己的 "number type" 上调用 sum,则需要定义 Numeric[Probability] 的实例。
放置自定义类型 class 定义的最佳位置是对象伴侣。
object Probability {
implicit val probabilityNumberic = new Numeric[Probability] {
def plus(x: Probability, y: Probability): Probability = ???
def minus(x: Probability, y: Probability): Probability = ???
def times(x: Probability, y: Probability): Probability = ???
def negate(x: Probability): Probability = ???
def fromInt(x: Int): Probability = ???
def toInt(x: Probability): Int = ???
def toLong(x: Probability): Long = ???
def toFloat(x: Probability): Float = ???
def toDouble(x: Probability): Double = ???
def compare(x: Probability, y: Probability): Int = ???
}
}
或者,如果您不想定义 Numeric[T] 实例,或者如果您想要 Probability 作为结果,您可以使用 reduce 而不是 sum。
List(Probability(0.4), Probability(0.3)).reduce(_ + _)
或 reduceOption 如果列表可能为空。
关于你可以在哪里定义你的Numeric[Probability]
,你必须考虑隐含的scope.It是常见的定义对象伴侣的默认实现,但你可以在求和调用之前创建它,通过导入,或者您可以显式使用它。这取决于你需要什么。