我正在尝试编写一个方法,它接受任何类型的集合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)
我感兴趣的答案也将在哪里工作CC是Array我很感兴趣,我尝试(下)都最终没有奏效的原因.
(对于不耐烦的人,在接下来的内容中,我完全没有让它发挥作用.重申一下,问题是"我怎么能写出这样的方法?")
我这样开头:
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)
好的,这是有道理的 - 我需要说这 …
假设我们想要创建一个像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)