在我的问题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))
}
}
我如何:
答案 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
。