我正在尝试实现一个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上定义的任何方法,即使存在子类型关系。我显然在这里缺少一些非常基本的东西,并且会感谢任何帮助。
答案 0 :(得分:2)
您可能希望约束为M[X] <: TraversableOnce[X]
。 _
很特别,使用您当前的签名,您只会知道M[A] <: TraversableOnce[_]
,而您想要M[A] <: TraversableOnce[A]
。
你错过了一个结束括号,这可能很重要。
你得到的确切编译错误是什么?