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

时间:2015-05-27 17:50:42

标签: scala typeclass

我正在尝试在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没有方法+*。所以我现在不确定如何实现这一点。一位教授建议调查类型和尖顶库,但我仍然遇到麻烦。

理想情况下,我希望拥有的内容是这样的

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

如果有人可以帮我解决这个问题,我会非常感激。谢谢。 :)

1 个答案:

答案 0 :(得分:2)

Scala有一个名为Numeric的类型类,其中包含通常的JVM编号类型的实现。

注意:它不满足Number[A] + Number[B]方案

以下示例

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

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

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

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

一些scala库方法(例如List' sum:def sum[B >: A](implicit num: Numeric[B]): B)采用隐式Numeric实例,因此如果引入RationalNumeric的隐式引用,则可以执行以下操作:

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

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

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