1

以下是用 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)
    }

4

2 回答 2

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,OrderingOrdered什么Comparator是什么Comparable。请注意,这Ordering[T]在本质上与 非常相似T => Ordered[T],但我认为当您是初学者时更容易理解。它还为您提供了一组很好的方法来创建和操作Orderings。

最后,请注意,使用List诸如快速排序之类的排序方法会导致性能非常差,因为附加到 aListO(n)。如果性能是一个问题,请使用Array快速排序的就地实现。

于 2019-04-22T12:42:38.847 回答
0

添加隐式参数

def qsort[T](list: List[T])(implicit ev: T => Ordered[T]) = ...
于 2019-04-22T01:46:18.070 回答