2010-04-13 7 views
10

Ich bin neu in Scala ... Hier ist der Code:Scala Compiler sagt unerreichbaren Code, warum?

def ack2(m: BigInt, n: BigInt): BigInt = { 
     val z = BigInt(0) 
     (m,n) match { 
      case (z,_) => n+1 
      case (_,z) => ack2(m-1,1) // Compiler says unreachable code on the paren of ack2(
      case _ => ack2(m-1, ack2(m, n-1)) // Compiler says unreachable code on the paren of ack2(
     } 
    } 

Ich versuche, das zu verstehen ..., warum es diesen Fehler geben?

Hinweis: Ich verwende Scala Eclipse Plugin 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group

Antwort

28

Die z innerhalb des Mustervergleich nicht auf die z bezieht Sie erklärt draußen führt es eine neue variable Bindung ein. Der erste Fall wird also mit jedem möglichen Paar übereinstimmen (Bindung z an das erste Element des Paares und Verwerfen des zweiten) und die anderen Fälle werden niemals erreicht.

Wenn Sie z im Muster mit

`z` 

ersetzen wird an den bestehenden z beziehen und nicht eine neue Bindung einzuführen, so ist es die Absicht, wie Sie zu arbeiten. Sie können auch z in Z umbenennen, wenn Sie die Syntax mit Backticks nicht mögen.

+0

Nun, Sie haben meine Frage beantwortet ... Ich hätte fragen sollen, wie ich es am besten beheben kann :) Ich könnte es ändern in Fall _ wenn m == 0 => n + 1; Fall _ wenn n == 0 => ack2 (m-1,1) ist, dass der einzige Weg, es zu tun? Ich kann nach dem Fall keine 0 direkt in den Parens schreiben, weil es sich darüber beschwert, dass es kein BigInt ist. Ich kann nicht BigInt (0) in die Pars setzen, weil es beschwert sich nicht darüber Fall Klassenkonstruktors – mentics

+0

@taotree zu sein: Ich denke, ich antwortete, wie es in meinem bearbeiten zu beheben. – sepp2k

Verwandte Themen