scala - 编写通用的 'fill'方法

标签 scala collections scala-collections

我正在尝试编写一个通用的fill方法,以下是我到目前为止提出的内容:

scala> import collection.generic.{GenericTraversableTemplate => GTT}
import collection.generic.{GenericTraversableTemplate=>GTT}

scala> import collection.generic.{TraversableFactory => TF}
import collection.generic.{TraversableFactory=>TF}

scala> def fill[A, CC[X] <: Traversable[X] with GTT[X, CC]]
     |   (n: Int)(elem: => A)(tf: TF[CC]) = tf.fill(n)(elem)
fill: [A, CC[X] <: Traversable[X] with scala.collection.generic.GenericTraversab
leTemplate[X,CC]](n: Int)(elem: => A)(tf: scala.collection.generic.TraversableFa
ctory[CC])CC[A]

scala> fill(3)('d')(List)
res42: List[Char] = List(d, d, d)

这适用于除数组之外的所有可遍历集合。如何使此代码与数组一起使用?

最佳答案

如果您不介意创建额外的对象,则可以

def fill[CC[_]](n: Int) = new {
  def apply[A](elem: => A)(implicit cbf: CanBuildFrom[Nothing, A, CC[A]]) = {
    val b = cbf()
    1 to n foreach { _ => b += elem }
    b.result
  }
}

它不能绕开异议(2),但是用法很不错:
scala> fill[List](3)("wish")
res0: List[java.lang.String] = List(wish, wish, wish)

scala> fill[Array](3)("wish")
res1: Array[java.lang.String] = Array(wish, wish, wish)

关于scala - 编写通用的 'fill'方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311453/

相关文章:

c++ - 是否可以在 C++ 中执行此 lambda 事件管理器?

scala - 如何使用 Spark 的映射转换在 Scala 中返回多个键值对?

performance - Scala 性能问题

scala - 在 scala 中对 tuples2 列表进行分组的更好、更有效的方法

scala - 更新 IntelliJ IDEA

java - 为什么注册到 DatagramChannel 的 SelectionKey 在 Scala 中返回 SelectableChannel 而不是 Java?

java - 使用 PriorityQueue 的 NullPointerException

scala - 创建 Spark 存在用户定义的函数,其工作方式类似于 Scala Array#exists 函数

Scalaz 验证 NEL mkString

java - 使用通配符返回通用类型对象的列表