2011-06-20 17 views
6

Soy un novato en scala. Trato de escribir una función que se "repite" un Array (Scala 2.9.0):Scala repeat Array

def repeat[V](original: Array[V],times:Int):Array[V]= { 
if (times==0) 
    Array[V]() 
else 
    Array.concat(original,repeat(original,times-1) 
} 

Pero no soy capaz de compilar este (sale un error acerca de la manifest) ...

Respuesta

6

es necesario preguntarse compilador para proporcionar la clase manifiesto para V:

def repeat[V : Manifest](original: Array[V], times: Int): Array[V] = ... 

La respuesta a la pregunta: ¿por qué es necesario, se puede encontrar aquí:

Why is ClassManifest needed with Array but not List?

No estoy seguro de dónde desea utilizarlo, pero generalmente puedo recomendarle que use List u otra colección adecuada en lugar de Array.

+0

Quiero extender una clase que necesita matrices como de entrada (para ser más específico la clase DenseMatrix de scalala). Allí los tipos numéricos (@specialized) se convierten implícitamente a 'Scalar'. Pero siempre necesitas dar todo el conjunto. Me gustaría tener una aproximación cercana a 'R', es decir, cuando la matriz no tenga la longitud requerida, simplemente repita y posiblemente corte para que se ajuste ... – teucer

5

Por cierto, una forma alternativa para repetir una matriz, sería la de "llenar" un Seq con referencias de la matriz y luego aplanar que:

def repeat[V: Manifest](original: Array[V], times: Int) : Array[V] = 
    Seq.fill(times)(original).flatten.toArray;