2010-04-13 35 views
10

Tôi mới đến Scala ... Dưới đây là các mã:Trình biên dịch Scala cho biết mã không thể truy cập, tại sao?

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

Tôi đang cố gắng để hiểu rằng ... tại sao là nó đưa ra lỗi đó?

Lưu ý: Tôi đang sử dụng Scala Eclipse Plugin 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group

Trả lời

28

z bên trong mô hình phù hợp không đề cập đến z bạn tuyên bố bên ngoài, nó giới thiệu một ràng buộc biến mới. Vì vậy, trường hợp đầu tiên sẽ phù hợp với mọi cặp có thể (ràng buộc z với phần tử đầu tiên của cặp và loại bỏ thứ hai) và các trường hợp khác sẽ không bao giờ đạt được.

Nếu bạn thay thế z trong mẫu với

`z` 

nó sẽ giới thiệu đến z hiện có và không giới thiệu một ràng buộc mới, vì vậy nó sẽ làm việc như bạn có ý định. Bạn cũng có thể đổi tên z thành Z nếu bạn không thích cú pháp với các dấu gạch chéo ngược.

+0

Vâng, bạn đã trả lời câu hỏi của mình ... Tôi cũng nên hỏi cách khắc phục tốt nhất, :) Tôi có thể đổi thành trường hợp _ nếu m == 0 => n + 1; case _ if n == 0 => ack2 (m-1,1) là cách duy nhất để làm điều đó? Tôi không thể đặt 0 trực tiếp trong parens sau vụ án vì nó phàn nàn về nó không phải là BigInt. Tôi không thể đặt BigInt (0) vào parens vì nó phàn nàn về nó không phải là constructor class case – mentics

+0

@taotree: Tôi nghĩ tôi đã trả lời cách sửa nó trong bản chỉnh sửa của mình. – sepp2k

Các vấn đề liên quan