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 に答える