Оператор <не поддерживает тип "Any". Как это исправить? - PullRequest
1 голос
/ 22 апреля 2019

Ниже приведена функция быстрой сортировки, написанная на Scala для сортировки списка смешанных типов (int, double, float и т. Д.). Ошибка выскочила и сказала в строке 3 «Несоответствие типов, ожидаемое: T => Boolean, фактическое: T => Any Не удается разрешить символ <». Как мне это исправить? </p>

Intellij IDE, работающая в Windows 10, выдала это сообщение об ошибке.


    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 ]

1 голос
/ 22 апреля 2019

Ответ Дмитрия будет работать для любого типа, который может быть неявно преобразован в 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 s.

Наконец, обратите внимание, что использование List для метода сортировки, такого как быстрая сортировка, приведет к очень плохой производительности, потому что добавление к List равно O(n).Если производительность является проблемой, используйте Array с реализацией быстрой сортировки на месте.

0 голосов
/ 22 апреля 2019

Добавить неявный параметр

def qsort[T](list: List[T])(implicit ev: T => Ordered[T]) = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...