在scala中传递参数化函数

时间:2013-12-19 11:52:36

标签: scala functional-programming

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

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))

一切似乎在逻辑上都是正确的,无法弄清楚为什么会发生这种情况? 帮助赞赏。

1 个答案:

答案 0 :(得分:2)

这是因为在您的内部函数merge中定义了类型T,就像您重新定义了在mergeSort中创建的那个。只需将def merge[T]更改为def merge并继续使用T参数化您的列表leftright等。这样您就可以告诉编译器“这与上面定义的TI相同在mergeSort“。