2011-06-20 9 views
6

Jestem nowicjuszem do scala. Próbuję napisać funkcję, która jest "powtarzalny" to Array (Scala 2.9.0):Scala Powtórz Array

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

Ale nie jestem w stanie skompilować ten (pojawia się błąd o manifest) ...

Odpowiedz

6

musisz poprosić kompilator, aby zapewnić klasę oczywisty dla V:

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

odpowiedź na pytanie: dlaczego jest to, że to konieczne, można znaleźć tutaj:

Why is ClassManifest needed with Array but not List?

Nie jestem pewien, gdzie chcesz go użyć, ale ogólnie mogę polecić użycie List lub innej odpowiedniej kolekcji zamiast Array.

+0

Chcę rozszerzyć klasę, która potrzebuje tablic jako wejścia (bardziej konkretnie klasa DenseMatrix od skalala). Tam (@specjalistyczne) typy liczbowe są niejawnie przekształcane w 'Scalar'. Ale zawsze musisz podać całą tablicę. Chciałbym mieć podejście zbliżone do "R", tj. Gdy macierz nie ma wymaganej długości, wystarczy powtórzyć i ewentualnie wyciąć tak, aby pasowało ... – teucer

5

BTW, alternatywny sposób na powtarzanie Array, byłoby „wypełnić” do Seq odniesieniami tablicy, a następnie spłaszczyć, że:

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