了解TraversableOnce和Subtyping

时间:2014-10-27 20:09:59

标签: scala

我正在尝试实现一个distinctBy方法,我可以轻松地为Seq做到这一点,但作为一个喜欢冒险的人,我想尝试做一些更通用的东西。

def distinctBy[A, B, M[_] <: TraversableOnce[_]](xs: M[A])(f: A => B)(implicit cbf: CanBuildFrom[M[A], A, M[A]]): M[A] = {

  val seen = mutable.Set.empty[B]
  val builder = cbf(xs)

  for (x <- xs) {
      val k = f(x)
      if (!seen.contains(k)) {
          seen += k
          builder += x
      }
  }

  builder.result()
}

这里的基本直觉是我映射到一个类型并跟踪其中的一组,而不是在原始集合的元素上定义的相等性。所以我可以采用不同的元组集来比较左侧元素或右侧元素。

即使我切换到使用forall,我也无法进行编译,因为它似乎并不认为xs具有TraversableOnce上定义的任何方法,即使存在子类型关系。我显然在这里缺少一些非常基本的东西,并且会感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可能希望约束为M[X] <: TraversableOnce[X]_很特别,使用您当前的签名,您只会知道M[A] <: TraversableOnce[_],而您想要M[A] <: TraversableOnce[A]

你错过了一个结束括号,这可能很重要。

你得到的确切编译错误是什么?