相关疑难解决方法(0)

使用scala集合 - CanBuildFrom麻烦

我正在尝试编写一个方法,它接受任何类型的集合CC[_]并将其映射到一个新的集合(相同的集合类型,但不同的元素类型),我正在挣扎皇家.基本上我正在尝试实现map不是集合本身.

问题

我正在尝试使用签名实现一个看起来有点像的方法:

def map[CC[_], T, U](cct: CC[T], f: T => U): CC[U]
Run Code Online (Sandbox Code Playgroud)

它的用法是:

map(List(1, 2, 3, 4), (_ : Int).toString) //would return List[String]
Run Code Online (Sandbox Code Playgroud)

我感兴趣的答案也将在哪里工作CCArray我很感兴趣,我尝试(下)都最终没有奏效的原因.


我的尝试

(对于不耐烦的人,在接下来的内容中,我完全没有让它发挥作用.重申一下,问题是"我怎么能写出这样的方法?")

我这样开头:

scala> def map[T, U, CC[_]](cct: CC[T], f: T => U)(implicit cbf: CanBuildFrom[CC[T], U, CC[U]]): CC[U] = 
     | cct map f
                                                             ^
 <console>:9: error: value map is not a member of type parameter CC[T]
       cct map f
           ^
Run Code Online (Sandbox Code Playgroud)

好的,这是有道理的 - 我需要说这 …

collections scala

21
推荐指数
3
解决办法
3456
查看次数

在泛型方法中返回原始集合类型

假设我们想要创建一个像minBy这样的函数返回集合中所有相同极简主义的元素:

def multiMinBy[A, B: Ordering](xs: Traversable[A])(f: A => B) = {
  val minVal = f(xs minBy f)
  xs filter (f(_) == minVal)
}

scala> multiMinBy(List("zza","zzza","zzb","zzzb"))(_.last)
res33: Traversable[java.lang.String] = List(zza, zzza)
Run Code Online (Sandbox Code Playgroud)

到目前为止,这么好,除了我们有一个Traversable后退而不是我们的初始List.

所以我尝试将签名更改为

def multiMinBy[A, B: Ordering, C <: Traversable[A]](xs: C)(f: A => B)
Run Code Online (Sandbox Code Playgroud)

希望我可能得到一个C回来而不是一个Traversable[A].但是,我没有得到任何回报:

scala> multiMinBy(List("zza","zzza","zzb","zzzb"))(_.last)

<console>:9: error: inferred type arguments [Nothing,Nothing,List[java.lang.String]] 
do not conform to method multiMinBy's type parameter bounds [A,B,C <: Traversable[A]]
Run Code Online (Sandbox Code Playgroud)

我认为这是因为我们C之前A已经推断出论证?所以我翻转了参数的顺序,并添加了一个演员:

def …
Run Code Online (Sandbox Code Playgroud)

generics collections scala

19
推荐指数
3
解决办法
2007
查看次数

标签 统计

collections ×2

scala ×2

generics ×1