【问题标题】:generic to specific collection after partial function application部分函数应用后对特定集合的泛型
【发布时间】:2019-08-15 23:35:16
【问题描述】:

我正在尝试将部分函数应用于泛型集合,同时返回特定集合而不是原始类型的 Traversable。

这是我尝试过的(除其他外):

def filter[A, B, C <: Traversable[A],Y<:B, D <: Traversable[Y]](xs: Option[D] with TraversableLike[A,Option[D]])(pf:PartialFunction[A,B]): D = {
   xs.collect(pf)
}

def filter[A, B, C <: Traversable[A], D <: Traversable[B]](xs: D with TraversableLike[A,D])(pf:PartialFunction[A,B])(implicit ev: B =:= Option[Double]): D = {
   xs.collect(pf)
}

知道为什么implicit ev: B =:= Option[Double] 找不到正确的类型吗?

我从这些帖子中获得灵感:
Returning original collection type in generic method

How do I apply the enrich-my-library pattern to Scala collections?

Writing my own generic map functioni

【问题讨论】:

    标签: scala generics scala-collections


    【解决方案1】:

    你可以这样做:

    import scala.collection.Iterable
    import scala.collection.generic.CanBuildFrom
    
    def collect[C[_], A, B](col: C[A])
                           (pf: PartialFunction[A, B])
                          (implicit ev: C[A] <:< Iterable[A],
                                    cbf: CanBuildFrom[Nothing, B, C[B]]): C[B] =
      col.iterator.collect(pf).to[C]
    

    【讨论】:

    • @Adrian 可以,但 Trasversable 没有iterator。因此,代码将基本相同,但效率较低(特别是如果您链接多个转换) - 无论如何,我怀疑是否有任何集合类型是 可遍历 但没有可迭代.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多