2010-04-13 20 views
10

Soy nuevo en Scala ... Aquí está el código:El compilador Scala dice código inalcanzable, ¿por qué?

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

Estoy tratando de entender que ... ¿Por qué es dando ese error?

Nota: Estoy usando Scala Eclipse Plugin 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group

Respuesta

28

El z dentro de la coincidencia de patrón no se refiere a la z declaraste afuera, introduce un nuevo enlace variable. De modo que el primer caso coincidirá con cada par posible (vinculando z al primer elemento del par y descartando el segundo) y nunca se alcanzarán los otros casos.

Si reemplaza z en el patrón con

`z` 

se referirá a la z existente y no introducir un nuevo enlace, por lo que funciona como deseaba. También puede cambiar el nombre de z a Z si no le gusta la sintaxis con trazos.

+0

Bueno, usted respondió mi pregunta ... Debería haberle preguntado cómo arreglarlo también :) Podría cambiarlo a caso _ si m == 0 => n + 1; caso _ si n == 0 => ack2 (m-1,1) ¿Es esa la única forma de hacerlo? No puedo poner un 0 directamente en los parens después del caso porque se queja de que no es un BigInt. No puedo poner BigInt (0) en los parens porque se queja de que no es el constructor de la clase de caso – mentics

+0

@taotree: Creo que respondí cómo solucionarlo en mi edición. – sepp2k

Cuestiones relacionadas