I have a recursive count function in Scala 2.9.2 that looks like this:
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))
At the input of Seq(('(', '(')) function throws the following MatchError :
scala.MatchError: Vector(((,()) (of class scala.collection.immutable.Vector)
I explored this while playing with code in the Scala console.
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)
It seems that a match ('a', 'b')::rest (second line) does not return an object of the correct type, since Seq[(Char, Char)] suddenly has the type java.lang.Object , which is Scala, then not knows how a coincidence.
What explains this behavior?