2013-12-19 118 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中的相同」。