将隐式 Ordering[Int] 参数传递给 Ordering[T] 参数

Pass implicit Ordering[Int] argument to Ordering[T] parameter

我想写一些归并排序函数。

如何向 merge 子函数提供 Ordering[T]

应用程序的整体结构如下:

object Main extends App {
  ...
  val array: Array[Int] = string.split(' ').map(_.toInt)

  def mergesort[T](seq: IndexedSeq[T]): IndexedSeq[T] = {
    def mergesortWithIndexes(seq: IndexedSeq[T],
                             startIdx: Int, endIdx: Int): IndexedSeq[T] = {
      import Helpers.append
      val seqLength = endIdx - startIdx
      val splitLength = seq.length / 2

      val (xs, ys) = seq.splitAt(splitLength)
      val sortXs = mergesortWithIndexes(xs, startIdx, startIdx + seqLength)
      val sortYs = mergesortWithIndexes(ys, startIdx + seqLength, endIdx)


      def merge(sortXs: IndexedSeq[T], sortYs: IndexedSeq[T],
                writeFun: Iterable[CharSequence] => Path)(ord: math.Ordering[T]): IndexedSeq[T] = {
        ...

        while (firstIndex < firstLength || secondIndex < secondLength) {
          if (firstIndex == firstLength)
            buffer ++ sortYs
          else if (secondIndex == secondLength)
            buffer ++ sortXs
          else {
            if (ord.lteq(minFirst, minSecond)) {
              ...
            } else {
              ...
            }
          }
        }
        buffer.toIndexedSeq
      }

      merge(sortXs, sortYs, append(output))
    }
    mergesortWithIndexes(seq, 0, seq.length)
  }

  val outSeq = mergesort(array)
  Helpers.write(output)(Vector(outSeq.mkString(" ")))
}

我想要一般的 merge() 函数定义,但在应用程序中我使用 IndexedSeq[Int] 并因此期望通过预定义排序[Int]

向最外层函数添加 implicit Ordering[T] 参数应该可以解决问题,传递非 Ordering[T] 参数将导致编译错误。

Scala 的排序函数做同样的事情:https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/SeqLike.scala#L635

def mergesort[T](seq: IndexedSeq[T])(implicit ord: math.Ordering[T]): IndexedSeq[T] = {