devo this function convertire un Array
ad un ParArray
, dando il numero di thread come parametro:parametri di tipo generico per la conversione in parallelo la raccolta
def parN[T](collection: Array[T], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Ora mi piacerebbe fare questo generico, tale da funziona con collezioni diverse da Array
:
def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}
Ma when I call it con parN(Array(1, 2, 3), 2)
, ottengo questo errore:
inferred type arguments [Int,Array] do not
conform to method parN's type parameter bounds
[S,T[S] <: scala.collection.Parallelizable[S,scala.collection.parallel.ParIterable[S]]]
D'altra parte, questo sta lavorando:
val x: Parallelizable[Int, ParIterable[Int]] = Array(1, 2, 3)
Tutte le idee che cosa potrebbe essere sbagliato con i miei parametri di tipo?
WOw, bastonatemi. Il modello di classe del tipo è il modo per andare qui. Tuttavia, non è necessario aggiungere un requisito ': Manifest' per lavorare con gli array? – wheaties
@wheaties no 'Manifest \ ClassTag' non è nemmeno necessario perché il suo metodo non sta effettivamente creando una matrice (' Parallelizable.par' non ha bisogno di un manifest, sa sempre come creare una raccolta par). E nel caso degli array, avvolge solo l'array originale, non lo copia nemmeno. – gourlaysama
Grazie per la risposta dettagliata, ho finito per utilizzare una vista "<%" associata a 'CustomParallelizable'. – ValarDohaeris