以下是用Scala编写的快速排序函数,用于对混合类型(int,double,float等)的列表进行排序。弹出错误并在第3行“类型不匹配,预期:T =>布尔值,实际:T =>任何无法解析符号<”。我该如何解决?
在Windows 10上运行的Intellij IDE给出了此错误消息。
def qsort[T](list: List[T]): List[T] = list match {
case Nil => Nil
case pivot :: tail =>
val(smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
}
答案 0 :(得分:1)
Dmytro的答案适用于任何可以隐式转换为Ordered[T]
的类型。这有点特殊,在惯用的Scala中,人们通常更喜欢使用隐式Ordering
来代替。这样,订单就与T
的实现完全分开了。
def qsort[T : Ordering](list: List[T]): List[T]
签名使用上下文绑定,[T: Ordering]
是语法糖,表示更详细
def qsort[T](list: List[T])(implicit ev: Ordering[T]): List[T]
如果您来自Java,那么Ordering
就是Ordered
,Comparator
就是Comparable
。请注意,Ordering[T]
的精神与T => Ordered[T]
十分相似,但是我认为,初学者时,将头束起来比较容易。它还为您提供了一组不错的方法来创建和操作Ordering
。
最后,请注意,将List
用于诸如快速排序之类的排序方法将导致非常差的性能,因为追加到List
的内容是O(n)
。如果需要考虑性能,请结合使用Array
和Quicksort的就地实现。
答案 1 :(得分:0)
添加隐式参数
def qsort[T](list: List[T])(implicit ev: T => Ordered[T]) = ...