dado:Pedidos y ordenada y comparar las opciones de
case class Person(name: String)
y tratando de hacer:
scala> List(Person("Tom"), Person("Bob")).sorted
resultados en una queja sobre la falta de pedidos.
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
Sin embargo esto:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
funciona bien como se esperaba:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
aunque no hay pedidos o implícitos en cuestión.
Pregunta n. ° 1: ¿Qué está pasando aquí? (Mi dinero es algo implícito ...)
Sin embargo, teniendo en cuenta lo anterior y el hecho de que esto:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
obras, y que también esto:
scala> List(Some(2), None, Some(1)).sorted
trabaja fuera de la caja:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
yo esperaría que esto:
scala> Some(2) > Some(1)
también funcionaría, sin embargo no es así:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
Pregunta # 2: por qué no, y cómo puedo conseguir que funcione?
Eso realmente no responde a la pregunta de por qué implementar Ordered [T] mágicamente genera una instancia de Ordering [T]. ¿Y por qué tienes que crear un método para hacer la última comparación? –
Hice el método para poder acceder a la instancia de Ordenar. Importación de los contenidos de esa instancia para que pueda obtener su conversión implícita a un 'Ops', que define algunos operadores de comparación. Usando ese mismo método, finalmente descubrí exactamente dónde está la conversión implícita para un 'Ordered '. http://www.scala-lang.org/api/current/index.html#scala.math.LowPriorityOrderingImplicits – Dylan
¿Pero eso parece mucho trabajo solo para poder comparar dos opciones? –