gpt4 book ai didi

scala - 用于转换为并行集合的通用类型参数

转载 作者:行者123 更新时间:2023-12-04 12:22:22 25 4
gpt4 key购买 nike

我有 this function转换 ArrayParArray ,给出线程数作为参数:

def parN[T](collection: Array[T], n: Int) = {
val parCollection = collection.par
parCollection.tasksupport = new ForkJoinTaskSupport(
new concurrent.forkjoin.ForkJoinPool(n))
parCollection
}

现在我想让它通用,这样它就可以用于 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
}

但是 when I call itparN(Array(1, 2, 3), 2) ,我收到此错误:
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]]]

另一方面,这是有效的:
val x: Parallelizable[Int, ParIterable[Int]] = Array(1, 2, 3)

任何想法我的类型参数可能有什么问题?

最佳答案

首先要注意,这是Array特有的问题:您的方法适用于 List或任何其他普通集合(具有多个类型参数的集合除外,或没有)。例子:

scala> parN(List(1,2,3), 2)
res17: scala.collection.parallel.ParIterable[Int] = ParVector(1, 2, 3)

scala> parN(Set(1,2,3), 2)
res18: scala.collection.parallel.ParIterable[Int] = ParSet(1, 2, 3)
Array当涉及到集合时总是一个特例,因为......它不是一个集合。因为Java,它的定义是 final class Array[T] extends Serializable with Cloneable .但是,存在两个隐式,随处可用,可以转换 Array到集合类型( ArrayOps WrappedArray )。而这些类型确实实现了 Parallelizable ,所以一切都应该没问题……除了类型推断妨碍了:

您的类型参数仅定义为 T[S] ,所以当收到 Array[Int] ,它会很乐意推断 Array[Int] ,然后检查边界:失败, Array不延长 Parallelizable .游戏结束。

我看到两个选项:
  • 你可以明确地说你想要一个 Parallelizable :
    def parN[S](collection: Parallelizable[S, ParIterable[S]], n: Int)

    或者,如果您需要访问实际类型 T (在你的情况下没有,但谁知道):
    def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S] with
    Parallelizable[S, ParIterable[S]], n: Int)
  • 或者您可以接受任何可以隐式转换为 Parallelizable 的内容,使用隐式参数:
    def parN[S, T <% Parallelizable[S, ParIterable[S]]](collection: T, n: Int)

    这是以下的简短版本:
    def parN[S, T](collection: T, n: Int)(implicit ev: T => 
    Parallelizable[S, ParIterable[S]])

  • 所有这些都应该有效。在你的情况下,我会推荐第一个:它是完成这项工作的最易读的一个。

    关于scala - 用于转换为并行集合的通用类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734759/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com