scala - 如何使用 CanBuildFrom 为 Traversable 定义隐式类?

标签 scala scala-collections

我正在尝试向 Traversable 添加一些方法通过拉皮条获得的特征 implicit class .

但我对 CanBuildFrom 有点迷茫特征。考虑以下:

implicit class TraversableExt[+A, +Repr <: Traversable[A]](traversable: Repr) {
  def debug[That](name: String)(implicit bf: CanBuildFrom[Repr, A, That]): That =
    traversable.map{ a => println(name + ": " + a); a }(bf)
}

这失败并出现错误:

Error:(21, 59) type mismatch;
found : scala.collection.generic.CanBuildFrom[Repr,A,That]
required: scala.collection.generic.CanBuildFrom[Traversable[A],A,That]
traversable.map{ a => println(name + ": " + a); a }(bf) ^



我猜是因为 ReprCanBuildFrom[-Repr, -Elem, +To]是逆变的,因此我的 Repr这是 Traversable[A] 的上限可能不起作用。

但总的来说,我很迷茫。任何人都可以帮忙吗?

最佳答案

您必须使用 TraversableLike和更高级的类型,使类型推断器满意并使其与 CanBuildFrom 一起使用:

implicit class TraversableExt[A, C[X] <: TraversableLike[X, C[X]]](traversable: C[A]) {
  def debug[That](name: String)(implicit bf: CanBuildFrom[C[A], A, That]): That =
    traversable.map{ a => println(name + ": " + a); a }(bf)
}

编译器现在能够正确推断您的集合的类型 C[A]而不是一般寻找 CanBuildFrom[Traversable[A],...]
根据经验,当您想返回与传入的相同的集合类时,您必须使用 *Like类(class)

关于scala - 如何使用 CanBuildFrom 为 Traversable 定义隐式类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515402/

相关文章:

scala - 组合 future - 如何获得与 future 列表结果相关联的另一个变量

algorithm - 图问题的函数/流编程 "Reconstruct Itinerary"

java - Scala 是否具有与 Haskell 的 Prelude.show 等效的功能?

scala - 物化可观察对象上的模式匹配图

list - 从 List 中获取前 n 个元素

Scala : creating directory and file

java - libGdx 和 Gradle 的 Scala 实例化错误

scala - 组合返回选项的函数

scala - 如何从 scala Iterator[T] 转换为 Option[T]

Scala RedBlackTree 语法