Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala集合和,用于重载加法_Scala_Collections_Sum_Operator Overloading_Implicit - Fatal编程技术网

Scala集合和,用于重载加法

Scala集合和,用于重载加法,scala,collections,sum,operator-overloading,implicit,Scala,Collections,Sum,Operator Overloading,Implicit,我试图使重载加法运算符与集合的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 fi

我试图使重载加法运算符与集合的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有关(正如错误消息明确指出的那样),但我不知道应该在哪里定义或添加它(在类
Probability
、它的伴生对象,或者在
sum
?)之后),或者它应该是什么样子,所以,如果你想在你自己的“数字类型”上调用sum,你需要定义一个Numeric[Probability]的实例

放置自定义类型类定义的最佳位置是对象伴侣

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 = ???
  }

}
或者,如果您不想定义数值[T]实例,或者希望得到一个概率结果,则可以使用reduce而不是sum

List(Probability(0.4), Probability(0.3)).reduce(_ + _)
或者如果列表可能为空,则使用reduceOption


关于可以在何处定义
数值[Probability]
,必须考虑隐式的作用域。在对象伴侣上定义默认实现是常见的,但您可以在sum调用之前通过导入创建它,也可以显式使用它。这取决于你需要什么。

感谢@SebastianCelestino的回答,并强调了范围的重要性。我唯一的评论是,你曾在文本和代码中将数字拼错为Numberic,除此之外,它的信息量很大。