Компилятор Scala сообщает о недоступном коде, почему? - PullRequest
10 голосов
/ 13 апреля 2010

Я новичок в 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

1 Ответ

29 голосов
/ 13 апреля 2010

Z внутри совпадения с образцом не относится к z, который вы объявили снаружи, оно вводит новую привязку переменной. Таким образом, первый случай будет соответствовать каждой возможной паре (привязка z к первому элементу пары и отбрасывание второго), а остальные случаи никогда не будут достигнуты.

Если заменить шаблон z в шаблоне на

`z`

он будет ссылаться на существующий z и не будет вводить новую привязку, поэтому он будет работать так, как вы задумали. Вы также можете переименовать z в Z, если вам не нравится синтаксис с обратными галочками.

...