2011-07-23 34 views
5

我试图写我自己的通用map功能,以下是我想出了:写我自己的通用映射functioni

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 
} 

这似乎与ListVector,但与Map工作秒。我应该做些什么改变才能和Map一起工作呢?

回答

3

以下代码适用于我。我觉得你的“地图”功能,只是工作方式为“地图#地图()”一样

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 
    } 
} 

输出目录(X,Y)

5

您的代码编译并运行就好了(注:我当Map应用型我使用Scala的2.9.0.1。你可能想提一提你使用的是什么版本的斯卡拉的。)

但是你map功能,即使是有意义的返回Map本身总是返回List。您可以通过将CC[_]更改为CC来避免这种情况。

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 
} 

但是,你需要明确的类型注释此功能调用它的时候,这是一个有点伤感:(相关博客文章A Generic Quicksort in Scala)。

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) 

必须有一些方法来避免这种丑陋的类型注释,但我不知道它。