3

この行で何が起こっていxて、連結されてxs1xて、xs1どこにも定義されていませんか?

case (x :: xs1, y :: ys1) =>

また、ここでは、どのような価値がxありyますか?ケースクラスの一部としてマージが再帰的に呼び出されていますか?

if( x < y) x :: merge(xs1 , ys)

完全な Scala コードは次のとおりです。

object mergesort {

    def msort(xs: List[Int]): List[Int] = {
        val n = xs.length / 2
        if(n == 0) xs
        else {
            def merge(xs: List[Int], ys: List[Int]): List[Int] = (xs , ys) match {
            case (Nil, ys) => ys
            case (xs, Nil) => xs
            case (x :: xs1, y :: ys1) =>
                if( x < y) x :: merge(xs1 , ys)
                else y :: merge(xs, ys1)
            }


        val (fst, snd) = xs splitAt n
        merge(msort(fst), msort(snd))
        }
    }                                         //> msort: (xs: List[Int])List[Int]

    val nums = List(2, -4, 5, 7, 1)           //> nums  : List[Int] = List(2, -4, 5, 7, 1)
    msort(nums)                               //> res0: List[Int] = List(-4, 1, 2, 5, 7)

}
4

4 に答える 4

2

case (x :: xs1, y :: ys1) =>  

::intoとを分解するためのパターンマッチングの構文糖衣listですheadtail

リストxsは頭xと尾に分解されxsます。

パターンマッチングでは、リストを分解します。::これは、通常constructのリストとは正反対です。

Scalaのパターンマッチングのポイントでオブジェクトの分解を読む

于 2012-10-26T11:08:17.603 に答える
1

これ

(xs , ys) match {
     ...     
    case (x :: xs1, y :: ys1) 

は、変数などを宣言するパターン マッチであり、シーケンス マッチをアサートするのと同じステートメントです。xxs1

x上記のコードは、xs が headと tailを持つシーケンスに分解できることを確認しており、分解できるxs1場合は、これら 2 つの変数の後続のコード ブロックで head/tail を使用できるようにします。

あなたの 2 番目の質問に答えるために (誰も持っていないので)、はい、merge関数 (外側の関数内で宣言されている) が再帰的に呼び出されています。

于 2012-10-26T10:27:17.233 に答える
0

以下は、scala を使用して List でパターン マッチングを行う方法の例です。

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> res0 match {
     | case h :: t => "more than two elements, " + h + " is the first"
     | case _ => "less than two elements"
     | }
res1: java.lang.String = more than two elements, 1 is the first

::の左側では、リストを先頭 ( ) と末尾 (リストの残りの部分)caseで分解し、最初の 内でのみ作成およびスコープされる値をおよびにバインドすることに注意してください。12, 3htcase

タプルを分解する方法は次のとおりです。

scala> val tp = ("a", 1)
tp: (java.lang.String, Int) = (a,1)

scala> tp match {
     | case (a, b) => a + " is a string, " + b + " is a number"
     | case _ => "something missing"
     | }
res2: java.lang.String = a is a string, 1 is a number

あなたの質問のコードでは、リストのタプルで物事とパターンマッチングの両方を混合しています(xs , ys)

case (x :: xs1, y :: ys1)タプルを 2 つのリストに分解し、2 つのリストをそれぞれの頭と尾に分解します。

于 2012-10-26T10:26:30.407 に答える
0

match-case キーワードは、scala でパターン マッチングを実行するために使用されます。これは、ケース クラスやエクストラクタなどのいくつかのメカニズムを使用してオブジェクトを照合/分解する方法です。Google で scala パターン マッチングを検索すると、必要な答えが見つかります。

于 2012-10-26T10:18:16.367 に答える