我正在编写参数化合并排序功能,并将较少的检查器作为函数传递。 但是,编译器会抛出以下错误。
type mismatch;
found : y.type (with underlying type T)
required: T
这是我的完整代码
def mergeSort[T] (list:List[T], pred:(T,T) =>Boolean):List[T]={
def merge[T](left:List[T], right:List[T], acc:List[T]):List[T] = (left,right) match{
case (Nil,_) => acc ++ right
case (_,Nil) => acc ++ left
case (x::xs, y::ys) => if(pred(y,x)) merge(left,ys,acc :+ y) else merge(xs,right,acc :+ x)
}
val m = list.length/2
if (m == 0) list
else {
val (l,r) = list splitAt m
merge(mergeSort(l,pred), mergeSort(r,pred), List())
}
}
问题在于
if(pred(y,x))
一切似乎在逻辑上都是正确的,无法弄清楚为什么会发生这种情况? 帮助赞赏。
答案 0 :(得分:2)
这是因为在您的内部函数merge
中定义了类型T,就像您重新定义了在mergeSort
中创建的那个。只需将def merge[T]
更改为def merge
并继续使用T参数化您的列表left
,right
等。这样您就可以告诉编译器“这与上面定义的TI相同在mergeSort
“。