创建一个空的子类型的IndexedSeq并使用TailRec

时间:2019-03-25 19:59:53

标签: scala generics recursion

在我的问题here之后,我有一个mergeSort函数,该函数接受IndexedSeq [A]的子类,并使用该merge()函数对其进行排序。

def mergeSort[A, Repr <: IndexedSeq[A]]
    (l: Repr)(implicit ev: Repr => SeqLike[A, Repr],
                       cbf: CanBuildFrom[Repr, A, Repr],
                       ordering: Ordering[A]): Repr = {
  if (l.length <= 1) l
  else {
    val (left, right) = l.splitAt(l.length / 2)
    merge[A, Repr](IndexedSeq.empty[A], mergeSort(left), mergeSort(right))
  }
}

我如何:

  1. 创建Repr类型的空实例吗?
  2. 使用scala.util.control.TailCalls._包使其尾部递归吗?

1 个答案:

答案 0 :(得分:1)

未经充分测试,并且我不相信这确实可以达到您的TailCall目标,但可以编译。

spring.datasource.auto-commit=false

您必须调用import scala.util.control.TailCalls._ def mergeSort[A :Ordering, C[_]](l: C[A])( implicit ev :C[A] => SeqLike[A, C[A]], cbf :CanBuildFrom[C[A], A, C[A]]) :TailRec[C[A]] = if (l.length <= 1) done(l) else { val (left, right) = l.splitAt(l.length / 2) for { tcl <- tailcall(mergeSort(left)) tcr <- tailcall(mergeSort(right)) } yield merge(l.drop(l.length), tcl, tcr) } 的最终返回值上的.result