Scala参数化归并排序——令人困惑的错误消息



调用(lt: (T,T) =>布尔)函数
时出现编译错误错误码是"类型不匹配;find: x.type(底层类型T) required: 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))
    }
  }
}

msortmerge具有不同的类型参数。删除merge中的T类型参数:

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,但不匹配。

相关内容

最新更新