2013-12-19 86 views
1

我正在编写一个参数化合并排序功能,并将较少的检查程序作为函数传递。 但是,编译器正在抛出以下错误。在scala中传递参数化函数

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

只是将'merge [T](''merge'('。 – senia

回答

2

发生这种情况是因为在你的内部函数merge中定义了一个类型T,就像你重新定义了在mergeSort中创建的类型。只需将def merge[T]更改为def merge并继续使用T来对列表进行参数化left, right等。这样您就可以告诉编译器“这与我在上面定义的mergeSort中的相同”。