我想在List上运行参数化的mean,但是它会抛出编译错误:
def mean[A](xs: Seq[A])(implicit num: Numeric[A]): Option[A] = {
import num._
if (xs.isEmpty) None
else Some(xs.sum / xs.size)
}
cmd11.sc:4: value / is not a member of type parameter A
else Some(xs.sum / xs.size)
^Compilation Failed
这种方法有什么问题?
Scala的数值层次结构在很多地方与Haskell相似。特别是,Numeric
不支持除法,因为有很多有用的类型可以相加和相乘,但不能除(矩阵是一个主要的例子)。
你要找的是Fractional
。您还需要将xs.size
(这是一个Int
)转换为您的泛型A
,这可以用Fractional.fromInt
完成。
def mean[A](xs: Seq[A])(implicit num: Fractional[A]): Option[A] = {
import num._
if (xs.isEmpty) None
else Some(xs.sum / fromInt(xs.size))
}