如何设计与用户定义的集合一起使用的函数?

时间:2014-02-21 22:43:27

标签: scala scala-collections

我在声明空集合时遇到问题 - 我无法使用Nil因为它会生成一个子类型...

def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S): (String, S) =
  if (seq.nonEmpty)
    ...
  else
    (reduction, Nil)

我也尝试了CanBuildFrom,但我只是编译错误...

def partiallyReduceString ... (implicit bf: CanBuildFrom[S, String, S]): (String, S) =
  if (seq.nonEmpty)
    ...
  else
    (reduction, bf().result())
  

无法使用String类型的元素构造S类型的集合   基于S类型的集合。

1 个答案:

答案 0 :(得分:2)

问题是你的元组的第二个元素应该是S类型,它可以被视为SeqLike集合,但不能反过来。所以即使是bf在这种情况下也无济于事。

另一点是,无论你在结果中放置什么,S都可以是ListArray类型,但是在编译时无法查看。您可能希望通过指定一种独立创建S类型的空集合的方法来定义另一个约束。

import scala.collection.SeqLike
implicit val emptyList = () => List()
implicit val emptyArray[T] = () => Array[T]()
def partiallyReduceString[S <: SeqLike[String, S]](reduction: String, seq: S)(implicit empty: () => S): (String, S) = {
  if (seq.nonEmpty)
    ???
  else
    (reduction, empty())
  }