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

时间:2016-09-27 23:50:26

标签: scala implicit

我想写一些mergesort函数。

如何将订购[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] ,因此期望传递预定义 Ordering [Int] < / strong>即可。

1 个答案:

答案 0 :(得分:1)

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] = {