我正在尝试编写自己的通用map
函数,以下是我的想法:
def map[A, B, CC[X] <: Traversable[X], That]
(xs: CC[A])(f: A => B)
(implicit cbf: CanBuildFrom[CC[_], B, That]): That = {
val b = cbf(xs)
for (a <- xs)
b += f(a)
b.result
}
这似乎适用于List
,Vector
,但不适用于Map
。我应该做些什么改变才能使它与Map
一起使用?
答案 0 :(得分:5)
您的代码编译并运行得很好(注意:我使用的是Scala 2.9.0.1。您可能想提一下您正在使用的Scala版本。)
但是,在map
上应用Map
函数时,即使返回List
本身有意义,也始终返回Map
。您可以通过将CC[_]
更改为CC
来避免这种情况。 (相关博文:A Generic Quicksort in Scala。)
def map[A, B, CC <: Traversable[A], That]
(xs: CC)(f: A => B)
(implicit cbf: CanBuildFrom[CC, B, That]): That = {
val b = cbf(xs)
for (a <- xs)
b += f(a)
b.result
}
但是你需要在调用它时显式地键入 - 注释这个函数,这有点让人伤心。
val xs = Map(45 -> 32, 11 -> 9)
map[(Int, Int), (Int, Int), Map[Int, Int], Map[Int, Int]](Map(45 -> 32, 11 -> 9))(identity)
// gives Map(45 -> 32, 11 -> 9)
必须有某种方法来避免这种丑陋的类型注释,但我不知道它。
答案 1 :(得分:3)
以下代码适合我。我认为你的'map'功能与'Map#map()'
的工作方式相同object App {
def main(args: Array[String]) {
val map1 = Map(1 -> "x", 2 -> "y")
println(map1.map(_._2))
println(map(map1)(_._2))
}
def map[A, B, CC[X] <: Traversable[X], That](xs: CC[A])(f: A => B)(implicit cbf: CanBuildFrom[CC[_], B, That]): That = {
val b = cbf(xs)
for (a <- xs)
b += f(a)
b.result
}
}
输出是List(x,y)