2013-12-19 2 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] (' with 'merge ('. – senia

ответ

2

Это происходит потому, что в вашей внутренней функции merge вы определяете тип T, это похоже на то, что вы переопределяете тот, который вы создали в mergeSort. Просто измените def merge[T] на def merge и продолжайте использовать T для параметризации ваших списков left, right и т. Д. Таким образом вы сообщаете компилятору «Это то же самое, что я указал выше в mergeSort».

Смежные вопросы