Tenga en cuenta que el segundo argumento para map
es un argumento implícito. Hay debe ser un alcance implícito con los tipos apropiados, o, de lo contrario, debe pasar tal argumento.
En su ejemplo, debe haber That
Set[String]
, B debe ser Int
y Repr
debe ser List[String]
. Por lo tanto, para que eso necesita compilar el siguiente objeto implícito en su alcance:
implicit object X: CanBuildFrom[List[String], Int, Set[String]]
No hay tal cosa en su alcance. Además, breakOut
no puede proporcionarlo, ya que, en sí mismo, necesita un CanBuildFrom
implícito, cuyo primer tipo puede ser cualquier clase (un descendiente contra-variante de Nothing
), pero restringido por los otros tipos.
echar un vistazo, por ejemplo, en la fábrica de CanBuildFrom
del objeto compañero de List
:
implicit def canBuildFrom [A] : CanBuildFrom[List, A, List[A]]
porque se une el segundo y tercer parámetro a través A
, lo implícito en cuestión no va a funcionar.
Entonces, ¿cómo sabe uno dónde buscar, con respecto a tales implicits? En primer lugar, Scala sí importa algunas cosas en todos los ámbitos.En este momento, puedo recordar las siguientes importaciones:
import scala.package._ // Package object
import scala.Predef._ // Object
// import scala.LowPriorityImplicits, class inherited by Predef
import scala.runtime._ // Package
Como nos preocupa implícitos, tenga en cuenta que al importar cosas de paquetes, las únicas posibles implícitos son únicos. Cuando importa cosas desde objetos (singletons), por otro lado, puede tener definiciones implícitas, valores y singletons.
En este momento, hay implicitos CanBuildFrom
dentro de Predef
y LowPriorityImplicits
, que se refieren a las cadenas. Nos permiten escribir "this is a string" map (_.toInt)
.
Entonces, salvo estas importaciones automáticas, y las importaciones explícitas que realiza, ¿dónde más se puede encontrar un implícito? Un lugar: los objetos complementarios de la instancia en la que se aplica el método.
Digo el objeto compañero s, en plural, porque los objetos complementarios de todos los rasgos y clases heredados por la clase de la instancia en cuestión pueden contener implícitos relevantes. No estoy seguro de si la instancia en sí puede contener un implícito. Para ser sincero, no puedo reproducir esto ahora mismo, así que ciertamente estoy cometiendo un error de algún tipo aquí.
En cualquier caso, busque dentro de los objetos complementarios.
Aquí está el post con una explicación bastante bien http://blog.bruchez.name/2012/08/getting-to-know-canbuildfrom-without-phd.html –
Para el registro, tal uso tiene un nombre conceptual: polimorfismo de tipo de retorno. – lcn