Scala compiler says unreachable code, why?
Asked Answered
M

1

10

I'm new to Scala... Here's the code:

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

I'm trying to understand that... why is it giving that error?

Note: I'm using Scala Eclipse Plugin 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group

Magellan answered 13/4, 2010 at 18:41 Comment(0)
S
29

The z inside the pattern match does not refer to the z you declared outside, it introduces a new variable binding. So the first case will match every possible pair (binding z to the first element of the pair and discarding the second) and the other cases will never be reached.

If you replace z in the pattern with

`z`

it will refer to the existing z and not introduce a new binding, so it will work as you intend. You can also rename z to Z if you don't like the syntax with backticks.

Saving answered 13/4, 2010 at 18:45 Comment(1)
Well, you answered my question... I should have asked for how best to fix it, too :) I could change it to case _ if m == 0 => n+1 ; case _ if n == 0 => ack2(m-1,1) is that the only way to do it? I can't put a 0 directly in the parens after the case because it complains about it not being a BigInt. I can't put BigInt(0) into the parens because it complains about it not being case class constructorMagellan

© 2022 - 2024 — McMap. All rights reserved.