运算符<似乎不支持“任何”类型如何解决?

时间:2019-04-22 01:35:20

标签: scala generics operator-overloading

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

2 个答案:

答案 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就是OrderedComparator就是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]) = ...