Int和Long的Scala中值函数

Int和Long的Scala中值函数,scala,generics,numbers,Scala,Generics,Numbers,我是scala语言的新手,正在尝试实现中值函数,该函数应同时适用于Int和Long,这就是我尝试做的: def getMedian[T: Numeric](seq: Seq[T]): T = { val sortedSeq = seq.sortWith(_ < _) if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2) else { val (up, down) = sortedSeq.

我是scala语言的新手,正在尝试实现中值函数,该函数应同时适用于Int和Long,这就是我尝试做的:

 def getMedian[T: Numeric](seq: Seq[T]): T = {
      val sortedSeq = seq.sortWith(_ < _)
      if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2)  else {
            val (up, down) = sortedSeq.splitAt(seq.size / 2)
            (up.last + down.head) / 2
       }
  }

但比较运算符对数值类无效。要完成此操作,我可以做些什么。

结果类型有问题。如果将整数除以2,结果不一定是整数。但谁来决定结果的准确性呢?应该是双倍的吗?或者浮动距离足够近吗

下面是一个必须显式指定结果类型的解决方案:

def getMedian[T: Ordering, F]
  (seq: Seq[T])
  (implicit conv: T => F, f: Fractional[F]): F = {
    val sortedSeq = seq.sorted
    if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2)  else {
      val (up, down) = sortedSeq.splitAt(seq.size / 2)
      import f._
      (conv(up.last) + conv(down.head)) / fromInt(2)
    }
}
您现在可以按如下方式使用它:

println(getMedian[Int, Float](List(1,2,3,4)))
println(getMedian[Int, Double](List(1,2,3,4)))
它两次输出2.5,但第一次是单精度,而最后一次是双精度


例如,您可以实现一个like,并使用T:Ordering来比较元素。这两种算法都不依赖于任何算术运算。

不管怎样,这都是一种逻辑运算。这是没有理由的。