En esta función parametrizada, ¿por qué necesito el molde? ¿Y cómo puedo deshacerme de eso?En esta función parametrizada de Scala, ¿por qué necesito el modelo?
/** Filters `xs` to have only every nth element.
*/
def everyNth[A <% Iterable[B], B](xs: A, n: Int, offset: Int = 0): A =
(xs.zipWithIndex collect { case (x, i) if (i - offset) % n == 0 => x }).asInstanceOf[A]
Si no tengo el molde al final, me sale este mensaje de error:
type mismatch; found : Iterable[B] required: A
Esta función (con el elenco) funciona para todos los casos que he probado en , y sé por escribir cosas como lo siguiente en el REPL Scala que es capaz de inferir el tipo de resultado correctamente cuando no en el contexto de una función parametrizada:
scala> val a: Stream[Int] = (Stream.from(0).zipWithIndex collect { case (x, i) if (i + 3) % 5 == 0 => x })
a: Stream[Int] = Stream(2, ?)
scala> a take 10 force
res20: scala.collection.immutable.Stream[Int] = Stream(2, 7, 12, 17, 22, 27, 32, 37, 42, 47)
por favor, explique!
Pregunta similar que utiliza 'CanBuildFrom' para evitar el problema: [Función que toma genéricamente un tipo y devuelve el mismo tipo] (http://stackoverflow.com/questions/10019529/function-which-generically- takes- a-type-and-returns-the-same-type). No puedo hacerlo para trabajar con esta pregunta, ¿alguien más? – sschaef
Obtuve CanBuildFrom para que funcionase para mi pregunta, y puse la solución en una respuesta. Vea la respuesta a continuación si tiene curiosidad. – Douglas
¡Buena respuesta! Por cierto, puede aceptar sus propias respuestas ... – sschaef