2011-06-26 31 views
10

Cố gắng tạo ra một danh sách các bộ hiển thị bội số nguyên tố ... ý tưởng là khớp với mỗi số nguyên trong danh sách được sắp xếp so với giá trị đầu tiên trong một bộ, sử dụng giá trị thứ hai để đếm. Có lẽ có thể làm điều đó dễ dàng hơn với takeWhile, nhưng meh. Rất tiếc, giải pháp của tôi sẽ không biên dịch:Số nhận dạng ổn định được yêu cầu trong khi khớp mẫu? (Scala)

def primeFactorMultiplicity (primeFactors: List[Int]) = { 

    primeFactors.foldRight (List[(Int, Int)]()) ((a, b) => (a, b) match { 
     case (_, Nil)  => (a, 1) :: b 
     case (b.head._1, _) => (a, b.head._2 + 1) :: b.tail 
     case _    => (a, 1) :: b 
    }) 
    } 

Nó nói "lỗi: số nhận dạng ổn định bắt buộc, nhưng tìm thấy b.head._1". Nhưng thay đổi case dòng thứ hai để sau hoạt động tốt:

 case (i, _) if (i == b.head._1) => (a, b.head._2 + 1) :: b.tail 

Tại sao điều này, và tại sao không thể trình biên dịch đối phó nếu có một sửa chữa đơn giản như vậy?

Trả lời

14

Biến trong mẫu sẽ ghi lại giá trị ở vị trí đó; nó không không so sánh. Nếu cú ​​pháp làm việc ở tất cả, kết quả sẽ là đặt giá trị a vào b.head._1, ghi đè giá trị hiện tại. Mục đích của việc này là để cho bạn sử dụng một khuôn mẫu để kéo thứ gì đó ra khỏi một cấu trúc phức tạp.

+0

Chúc mừng, trông giống như tôi không hiểu làm thế nào mô hình phù hợp với làm việc. Có lẽ tôi nên đọc một cuốn sách về Scala một trong những ngày này. –

+0

@Luigi: Tôi khuyên bạn nên bắt đầu từ đây http://www.artima.com/pins1ed/;) –

3

b.head._1 không phải là một tên hợp lệ cho kết quả của (x, y) tuple vắt

Hãy thử điều này thay vì:

case (x, _) if x == b.head._1 => (a, b.head._2 + 1) :: b.tail 
Các vấn đề liên quan