如何在 Scala 中使用通用数字类型进行加法和乘法?

How to have generic numeric type in scala for addition and multiplication?

我正在尝试在支持加法和乘法的 Scala 中实现泛型数字,可以模式匹配任何数字并且不限于 IntDouble 等任何一种类型. 我查阅了文档,发现 java.lang.Number 符合最后一个标准,即任何与 java.lang.Number 相匹配的数字模式都通过了。所以我很快写了这个实现:

case class Number(num: java.lang.Number) {
  def +(that: Number) = Number(this.num + that.num)
  def *(that: Number) = Number(this.num * that.num)
}

然而,事实证明,java.lang.Number 没有方法 +*。所以我现在不确定如何实施。一位教授建议研究类型类和 spire 库,但我仍然遇到问题。

理想情况下,我想要的是这样的

Number[A] + Number[A] returns Number[A]
Number[A] + Number[B] return Number[Finest type containing both A and B]

如果有人能帮助我解决这个问题,我将不胜感激。谢谢。 :)

Scala 有一个名为 Numeric 的类型class,实现了通常的 JVM 数字类型。

注:不满足Number[A] + Number[B]场景


下面的例子

如果您想定义自己的号码类型,例如

case class RationalNumber(numerator: Int, denominator: Int)

然后你还要为它实现一个Numeric实例

object RationalNumeric extends Numeric[RationalNumber] {
  // implement the abstract methods
}

一些 Scala 库方法(例如 List 的总和:def sum[B >: A](implicit num: Numeric[B]): B)采用隐式 Numeric 实例,因此如果您引入对 RationalNumeric 的隐式引用,您可以这样做:

List(RationalNumber(1,2), RationalNumber(2,3)).sum

此外,Numeric 定义了一个隐式升级,将运算符添加到其 class,因此您可以这样做:

import RationalNumeric._
val sum = RationalNumber(1,2) + RationalNumber(2,3)