如何在 Scala 中使用通用数字类型进行加法和乘法?
How to have generic numeric type in scala for addition and multiplication?
我正在尝试在支持加法和乘法的 Scala 中实现泛型数字,可以模式匹配任何数字并且不限于 Int
、Double
等任何一种类型. 我查阅了文档,发现 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)
我正在尝试在支持加法和乘法的 Scala 中实现泛型数字,可以模式匹配任何数字并且不限于 Int
、Double
等任何一种类型. 我查阅了文档,发现 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)