0

如果我有一个不同类型的向量,比如说,Vector("abcde",Vector(1,2,3),List(4,5,6),7)我想要一个函数:deep_reverse 将向量深度反转为Vector(7,List(6,5,4),Vector(3,2,1),"edcba"),我想要类似的东西:

def reverse2(xs:Seq[Any]):Seq[Any] = xs match{
case Seq() => Seq()
case a +: ys=> a match{
    case _:Seq[Any] =>reverse2(ys) ++: reverse2(a)
    case _:Int =>reverse2(ys) ++: Seq(a)
 }

但我无法通过编译器,如何更正我的代码?非常感谢!

4

2 回答 2

2

首先,这是非常可怕的代码,因为你永远不应该使用Any. 类型安全的重点是了解数据的类型,并保证代码可以使用它们。这段代码抛弃了使用类型语言的任何好处,而且确实不安全。如果你的 Seq 包含一个数组会发生什么?还是双标?还是用户定义的类?这些应该如何反转?

也就是说,你让事情变得比他们需要的更复杂。无需通过匹配进行递归方法,只需反转主列表,然后映射每个元素。

def reverse2(xs: Seq[Any]): Seq[Any] = {
  xs.reverse.map {
    case i: Int => i
    case s: String => s.reverse
    case s: Seq[Any] => reverse2(s)
  }
}

a顺便说一句:您的编译错误是由于Seq[Any]您调用reverse2(a). 你需要做类似的事情case b: Seq[Any] => ... reverse2(b)

即使您修复了该问题,您仍然会收到运行时错误,因为您没有处理String.

于 2013-10-25T17:18:24.140 回答
0

你非常接近:)

    def reverse2(xs:Seq[Any]):Seq[Any] = xs match{
    case Seq() => Seq()
    case a +: ys=> a match{
        case x:Seq[Any] =>reverse2(ys) ++: reverse2(x)
        case y:Int =>reverse2(ys) ++: Seq(y)
     }
   }
于 2013-10-25T17:19:25.903 回答