def conversion scala implicit

def - scala implicit conversion



¿Cómo ayuda implícita<:<a encontrar parámetros de tipo (1)

Como comentó pedrofurla , lo has hecho bien, con una pequeña calificación. Usted dice que el compilador "jala" se conforms[Traversable[A]] , pero realmente no hay necesidad de tal instancia aquí. Para tomar un ejemplo simplificado donde está muy claro qué implicaciones están en el alcance:

trait Foo[-From, +To] implicit object intListFoo extends Foo[List[Int], List[Int]]

Ahora definitivamente no hay Foo[Traversable[Int], Traversable[Int]] , pero podemos escribir lo siguiente:

scala> implicitly[Foo[List[Int], Traversable[Int]]] res0: Foo[List[Int],Traversable[Int]] = intListFoo$@8e760f2

Más o menos exactamente lo mismo está sucediendo en su ejemplo. En ese caso tendríamos una instancia Traversable[Int] <:< Traversable[Int] si la necesitáramos, pero no para esa búsqueda implícita específica.

Surgen un par de preguntas mientras estoy leyendo 7.3.2 Capturando restricciones de tipo de Scala en profundidad de Joshua. El ejemplo extraído del libro:

scala> def peek[C, A](col: C)(implicit ev: C <:< Traversable[A]) = (col.head, col) peek: [C, A](col: C)(implicit ev: <:<[C,Traversable[A]])(A, C) scala> peek(List(1, 2, 3)) res9: (Int, List[Int]) = (1,List(1, 2, 3))

Parece sencillo que se encuentra que C está en la List[Int] por la primera lista de parámetros. Y cómo <:< impone la restricción de tipo por variación se explica en el libro. Pero no veo cómo ayuda a encontrar a A

Mi entendimiento es que, a partir de la primera lista de parámetros, Scala encuentra C: List[Int] , luego busca implicit ev: <:<[List[Int], Traversable[A]] . Por el momento A sigue siendo desconocido. "Tira" dos implicits conforms[List[Int]] y conforms[Traversable[A]] para que coincida con ev . En cualquier caso, para satisfacer la varianza, debe cumplirse la List[Int] <: Traversable[A] , lo que lleva al hallazgo de que A es Int .

¿Funciona como lo que estoy describiendo aquí? Especialmente sobre cómo / cuando se deduce A