调用(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))
}
}
}
答案 0 :(得分:3)
msort
和merge
具有不同的类型参数。从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
,您可以使用x
和y
来调用T
类型,并且不要使用{{1}}匹配。