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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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_Typeclass - Fatal编程技术网

如何在scala中拥有用于加法和乘法的通用数字类型?

如何在scala中拥有用于加法和乘法的通用数字类型?,scala,typeclass,Scala,Typeclass,我试图在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 *(t

我试图在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
没有方法
+
*
。所以我不知道现在该如何实施。一位教授建议研究打字课和尖塔图书馆,但我仍然有困难

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

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

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

Scala为此提供了一个typeclass,并为常见的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
)采用隐式数值实例,因此如果引入对
RationalNumeric
的隐式引用,可以执行以下操作:

List(RationalNumber(1,2), RationalNumber(2,3)).sum
另外,
Numeric
定义了一个隐式升级,将运算符添加到其类中,因此您可以执行以下操作:

import RationalNumeric._
val sum = RationalNumber(1,2) + RationalNumber(2,3)
如果A和B是“标准”数字类型,则numeric满足numeric[A]+numeric[B]。例如:
def sum[A:Numeric](a1:A,a2:A):A=隐式[Numeric[A]]。加上(a1,a2)
。用法示例:
sum(3,6.7)/=9.7,其中3是Int,6.7是Double
。使用隐式,您还可以提供自己从B到A的转换。