scala参数化合并排序 - 混淆错误消息

时间:2014-05-31 22:46:43

标签: scala sorting mergesort

调用(lt:(T,T)=>布尔)函数时出现编译错误
错误代码是"类型不匹配; found:需要x.type(带底层类型T):T"
并且 lt( x ,y)中的x参数带有下划线。

object sort {
  def msort[T](xs: List[T])(lt: (T, T) => Boolean): List[T] = {
    def merge[T](xs: List[T], ys: List[T]): List[T] = (xs, ys) match {
      case (Nil, ys) => ys
      case (xs, Nil) => xs
      case (x :: xs1, y :: ys1) => {
        if (lt(x, y)) x :: merge(xs1, ys)
        else y :: merge(xs, ys1)
      }
    }

    val n = xs.length / 2
    if (n == 0) xs
    else {
      val (left, right) = xs splitAt n
      merge(msort(left)(lt), msort(right)(lt))
    }
  }
}

1 个答案:

答案 0 :(得分:3)

msortmerge具有不同的类型参数。从T

中删除merge类型参数
def merge(xs: List[T], ys: List[T]): List[T] = (xs, ys) match {

[T]声明与第一个无关的新参数。如果将其声明为:

,则会出现相同的错误
def merge[U](xs: List[U], ys: List[U]): List[U] = (xs, ys) match {

lt的类型为(U, U) => Boolean,您可以使用xy来调用T类型,并且不要使用{{1}}匹配。