scala - programacion - ¿Cómo pueden las colecciones usar conversiones implícitas en los tipos de elementos?
no se puede convertir implícitamente el tipo double en float (2)
scala> implicit def ordering[T <% Ordered[T]] = new Ordering[T]{def compare(x: T, y: T) = x compare y}
ordering: [T](implicit evidence$1: (T) => Ordered[T])java.lang.Object with Ordering[T]
scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T]
Mientras trabajaba en esta pregunta , se me ocurrió el siguiente problema. Considere dos definiciones de métodos:
def foo[T <: Ordered[T]](s : Seq[T]) = s.sorted
def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
El primero compila, el segundo no. El compilador no se da cuenta de que puede usar la conversión implícita declarada para obtener un Ordering
. Si ayudamos un poco, funciona:
def foo[T <% Ordered[T]](s : Seq[T]) = s.sortWith(_<=_)
Al compilar la función anónima, el compilador aplica la conversión implícita para encontrar el método <=
, todo está bien.
No tengo otro ejemplo, pero puedo imaginar problemas similares con otras funciones en las colecciones que requieren elementos para tener ciertas propiedades, si solo pueden afirmarse a través de la conversión.
¿Hay alguna razón particular por la cual el compilador está restringido de esta manera? ¿No hay una forma general de resolver estos problemas? (Aquí parece fácil.) ¿Hay una solución, por ejemplo, otra conversión implícita que traduce la propiedad en la Key[T]
a T
?
(Tenga en cuenta que la última idea puede ser problemática si un valor concreto para T
termina teniendo la propiedad, entonces obtenemos una situación ambigua).
% scala29
Welcome to Scala version 2.9.0.r24168-b20110202012927 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T]
scala>
Por cierto, re "aquí parece fácil", no fue así. Implicits como estos disfrutan divergiendo y eran bastante determinados.