如何在scala中以递归方式创建mapValues

时间:2016-07-08 14:42:09

标签: scala

我最近开始使用scala,不太擅长... 我正在尝试编写一个函数,有点像地图值,它将递归地映射值,我的意思是,你可以在下面的例子中看到。

我试图将此功能添加到Map对象,但它一直这样说 “递归方法必须有一个返回类型”,虽然我认为我已经理解了我似乎找不到合适解决方案的问题。

感谢您的帮助!

val x = Map(1 -> 1,2 -> Map(3 -> 3))


implicit class mapOps (map:Map){

  def mapRec[T](obj:T):String = obj match{
    case x: Int => x.toString
    case x:Map => x.mapRec(_)
  }
}

这是我想得到的结果:

Map(1 -> "1", 2 -> Map(3 -> "3"))

勉强好奇我设法为我的问题找到解决方案

implicit class mapOps[A](map:Map[A,Any]) {
  def mapRec(): Map[A, Any] = {
    map.mapValues {
      case x: Int => x.toString
      case x: Map[A, Any] => x.mapRec()
    }
  }
}

它更通用了。

1 个答案:

答案 0 :(得分:1)

x的类型为Map[Int, Any],您需要为尾递归函数提供返回类型,并使用mapValues在给定的输入映射上映射值,即{{1和}。

x