Scala等价于Java的带有除法的Number

时间:2018-11-09 14:22:31

标签: scala

我想概括这个功能

def selfSufficiency(a: Seq[Double], b: Seq[Double]): Double = 
  a.sum/b.sum

我尝试使用here提供的构想来实现更通用的功能,该功能可用于Doubles,Floats,Ints等。

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Numeric[A]):A = {
 import n._
 a.sum/b.sum
}

但是我从eclipse那里得到一句话

  

value /不是类型参数A的成员。

1-如何以功能/通用的方式实现此功能?

2-我的实现是否限制用户为两个输入使用相同的类型“ A”?换句话说,我可以使用我的代码吗?

selfSufficiency(Seq(1,2,3), Seq(2.0,1.3))

如果我做不到,请说明如何实施?

请注意,此处的代码提供了一个玩具示例。在生产函数中,我加,减,找到较大的数字,等等。

2 个答案:

答案 0 :(得分:3)

问题在于Numeric不对除法函数进行编码-您需要Fractional

因此您的代码变为

def selfSufficiency[A](a: Seq[A], b: Seq[A])
     (implicit n: Fractional[A]):A = {
 import n._
 a.sum/b.sum
}

现在可以使用了。

修改 我刚刚阅读了您问题的这一部分。

  

我的实现是否限制用户为两个输入使用相同的类型“ A”?换句话说,我可以使用我的代码吗?

由于FractionalNumeric都仅在一个T中进行了参数设置,因此两个参数都必须来自同一类型-例如,看看div function

但是,由于精度较低的数值是(图1)数值较高的子类型。您可以通过upcast使它正常工作,但需要更多帮助编译器。

selfSufficiency[Double](Seq(1,2,3), Seq(2.0,1.3)) // res1: Double = 1.8181818181818183

注意:如果不将类型指定为Double,则编译器将产生以下错误。

error: could not find implicit value for parameter n: Fractional[AnyVal]

图1

scala-hierarchy

参考: https://www.artima.com/pins1ed/scalas-hierarchy.html

答案 1 :(得分:0)

您要寻找的是Fractional特性,它是支持div的更窄的数字(子类型)。