0

countScala 2.9.2 には、次のような再帰関数があります。

def count(traces: Seq[(Char, Char)], acc: (TP, TN, FP, FN)): (TP, TN, FP, FN) = {
  val (tp, tn, fp, fn) = acc
  traces match {
    case Nil => acc
    case ('(', '(')::rest => count(rest, (tp + 1, tn, fp, fn))
    case (')', ')')::rest => count(rest, (tp + 1, tn, fp, fn))
    case ('(', ')')::rest => count(rest, (tp, tn + 1, fp, fn))
    // ... exhaustive set of cases ...
  }
}

入力時Seq(('(', '('))に、関数は次をスローしますMatchError

scala.MatchError: Vector(((,()) (of class scala.collection.immutable.Vector)

これについては、Scala コンソールでコードをいじって調べました。

scala> val t = Seq(('a', 'b'), ('b', 'c'))
t: Seq[(Char, Char)] = List((a,b), (b,c))

scala> t match { case Nil => "h"; case ('a', 'b')::rest => rest }
res6: java.lang.Object = List((b,c))

scala> t1 match { case Nil => "h"; case ('a', 'b')::rest => rest }
scala.MatchError: List((b,c)) (of class scala.collection.immutable.$colon$colon)

マッチング('a', 'b')::rest(2 行目) が正しい型のオブジェクトを返していないように見えます。これは、Scala がマッチング方法を知らないSeq[(Char, Char)]突然の型になったためです。java.lang.Object

この動作を説明するものは何ですか?

4

1 に答える 1

0

パターン マッチングの問題は、List クラスに対してのみ定義されたエクストラクタ を使用し、Vector を渡すことです。

考えられるすべての Seq に対して照合する必要がある場合は、一般的な構文を使用することをお勧めします。

   foo match {
     case Seq('(' -> ')',rest@ _* ) => println("The tail is" + rest)
   }

->(矢印と混同しないでください。基本的にはと1 -> 2同じ(1,2)ですが、この特定のケースでははるかに読みやすくなっています。'('')'Seq(('(',')'), ... )

それ以外の場合は、引数の型を List[( Char , Char)] に限定してください。

于 2012-12-07T00:29:22.447 に答える