помогите с неявным значением - PullRequest
2 голосов
/ 28 июля 2011

У меня есть этот бит кода, который работает:

val directions = rs.map(_.direction) // Direction extends Enumeration
directions == directions.sorted.reverse

Я бы хотел вместо этого сделать что-то вроде этого:

ratings.map(_.direction).isInBackwardsOrder


class RichSeq[T](seq: Seq[T]) {
    def isInBackwardsOrder = seq == seq.sorted.reverse
}

object RichSeq {
    implicit def seq2richSeq[T](seq: Seq[T]) = new RichSeq[T](seq)
}

Я получаю следующую ошибку компиляции:

could not find implicit value for parameter ord: Ordering[T]
def isInBackwardsOrder = seq == seq.sorted.reverse

Что я не понимаю, так это то, почему он может найти неявное значение для параметра ord, когда он был в исходной форме, но не может найти его, как только я перетащу его в служебный класс.

Спасибо за помощь, Alex

1 Ответ

6 голосов
/ 28 июля 2011

В исходном виде у вас не было генериков. directions - это Seq[SomeWellKnownType], и во время компиляции компилятор ищет Ordering[SomeWellKnownType] в неявном объеме и находит его.

С другой стороны, в RichSeq[T] компилятор должен найти неявное Ordering[T], где T - параметр типа. Нет способа сделать это. Вы должны убедиться, что Ordering будет доступен при создании RichSeq:

class RichSeq[T](seq: Seq[T])(implicit ev: Ordering[T]) {...

Существует сокращение для этого, особенно если вам просто нужен ev в неявной области видимости без явной ссылки, как здесь:

class RichSeq[T : Ordering](seq: Seq[T]) {...

Тогда у вас точно такая же проблема в вашем неявном методе, который также является общим, с тем же решением:

implicit def seq2richSeq[T: Ordering](seq: Seq[T]) = new RichSeq[T](seq)

Тогда это должно работать. Неявное преобразование seq2richSeq сработает, когда упорядочение будет доступно для типа элементов в Seq.

...