如何使用我自己的通用`map`(正确的方法)来丰富Scala集合?

时间:2011-12-12 10:08:09

标签: scala

我正在尝试使用我自己的map方法来丰富Scala集合,并且我很接近,但隐式转换不起作用。除此之外,还有什么我在这里不见了吗?我正在寻找网络上的各种其他资源,包括这个问题被标记为重复的SO答案,并且许多人在这里和那里都缺少某些东西(例如使用C[A] <: GenTraversable[A],使用{ {1}}而不是b(),忘记b(xs),忘记了Array等。)

BitSet

2 个答案:

答案 0 :(得分:4)

我上周刚回答this very question about type inference。这是代码:

implicit def conv[A,C <: GenTraversable[A]](xs: C with GenTraversableLike[A,C]) = new {
  def mymap[B,D](f: A => B)(implicit b: CanBuildFrom[C,B,D]): D = {
    val builder = b(xs)
    xs foreach { x => builder += f(x) }
    builder.result
  }
}

在这种特殊情况下,我本可以使用GenTraversable代替GenTraversableLike。我更喜欢后者,因为它提供更多。

问题在于,声明[A, C <: GenTraversable[A]] 指示Scala从A的类型推断出C的类型。类型是根据它们在参数中的使用方式推断出来的,然后根据类型参数指定的边界进行检查。

所以当我写xs: C with GenTraversable[A]时,我让Scala知道它应该从A推断xs。编写GenTraversableLike[A, C]告诉Scala它应该为返回相同集合的方法选择返回 C的集合。这意味着您可以致电filter并获取C,而不是返回GenTraversable

至于希望包含观点,我不知道你将如何完成。

答案 1 :(得分:1)

我已经回答了类似的问题here。您还可以参考this thread,其中Rex Kerr解释了如何执行此类拉皮条。