Дано:
case class Person(name: String)
и попытаться сделать:
scala> List(Person("Tom"), Person("Bob")).sorted
приводит к жалобе о недостающем заказе.
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
Однако это:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
работает нормально, как ожидалось:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
хотя там не задействованы Приказы или подразумеваемые.
Вопрос №1: что здесь происходит? (Мои деньги на что-то неявное...)
Однако, учитывая сказанное выше и тот факт, что это:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
работает, и это также:
scala> List(Some(2), None, Some(1)).sorted
работает из коробки:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
Я бы ожидал, что это:
scala> Some(2) > Some(1)
также будет работать, однако это не так:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
Вопрос №2: почему бы и нет, и как я могу заставить его работать?