10

私はScalaが初めてです...コードは次のとおりです。

  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(
      }
  }

私はそれを理解しようとしています...なぜそのエラーが発生するのですか?

注: Scala Eclipse プラグイン 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group を使用しています。

4

1 に答える 1

29

パターン マッチ内の z は、外側で宣言した z を参照しません。新しい変数バインディングが導入されます。したがって、最初のケースはすべての可能なペアに一致し (z をペアの最初の要素にバインドし、2 番目の要素を破棄します)、他のケースには到達しません。

zパターンを次のように置き換えると

`z`

既存の z を参照し、新しいバインディングを導入しないため、意図したとおりに機能します。バッククォートを含む構文が気に入らない場合は、z を Z に名前変更することもできます。

于 2010-04-13T18:45:34.970 に答える