通过隐式为 Scala 序列自定义高阶函数



当在列表上调用时,我们想要一个列表,在序列上返回一个 Seq。

implicit class SeqWithMyFilter[+T](seq: Seq[T]) {
  def myFilter(pred: T => Boolean): Seq[T] = seq.filter(pred)
}
scala> List("x").myFilter(_=="x")
res1: Seq[String] = List(x)

但是添加类型不会编译:

implicit class SeqWithMyFilter[+T, +U <: Seq[T]](seq: U) {
  def myFilter(pred: T => Boolean): U = seq.filter(pred)
}

。由于 seq.filter(pred) 总是返回一个 seq...

您要做的是使用SeqLike,以便:

implicit class SeqWithMyFilter[A, Repr <: SeqLike[A, Repr]](seq: Repr){
  def myFilter(pred: A => Boolean): Repr = seq filter pred
}

因为filter的定义是根据实现类定义的:

abstract def filter(pred: T => Boolean): Repr

看看TraversableLike。您会发现ListSeq和许多(不是全部)继承或混合Traversable的继承或混合都是在SeqLike方面实现的。

最新更新