2010-02-16 27 views
13

Tôi có một tập hợp các trường hợp lớp học như thế nàyLàm thế nào để thực hiện khớp mẫu với các trường hợp vararg?

abstract class Shape 
case class Rectangle(width: Int, height: Int) extends Shape 
case class Location(x: Int, y: Int, shape: Shape) extends Shape 
case class Circle(radius: Int) extends Shape 
case class Group(shape: Shape*) extends Shape 

nơi cơ bản Group là một mảng của hình dạng. Tôi cần phải xác định một phương pháp kích thước cho các kích thước máy tính cho hình chữ nhật, hình tròn và vị trí của nó đơn giản chỉ cần trả lại một. Nhưng tôi đang gặp khó khăn cho Tập đoàn.

object size extends Shape{ 
    def size(s: Any) : Int = s match { 
    case Rectangle(x,y) => 1 
    case Group // how to do it? Also having case Group(shape : Shape*) gives an error 
    case Circle(r) => 1  
    case Location(x,y,shape) => 1 
    } 
} 

Tôi biết cho Nhóm i cần sử dụng bản đồ và gấp trái, nhưng tôi thực sự không thể tạo logic cho nó. Cảm ơn

Trả lời

8

Cú pháp cho đối sánh mẫu hình chữ V có phần là strange.

def size(s: Shape) : Int = s match{ 
    case Rectangle(x,y) => 1 
    case Circle(r) => 1 
    case Location(x,y,shape) => 1 
    case Group(shapes @ _*) => (0 /: shapes) { _ + size(_) } 
} 

Lưu ý rằng trong dòng cuối cùng, bạn tổng hợp các kích thước của tất cả các phụ shapes bắt đầu với không sử dụng /: -notation cho nếp gấp.


Cách folds hoạt động: Số lần tích lũy các phần tử của chuỗi bằng một hàm nhất định.

Vì vậy, để tính tổng của một danh sách, chúng ta sẽ viết (Haskell kiểu)

fold (\total element -> total + element) 0 list 

mà sẽ kết hợp tất cả các yếu tố của danh sách với các chức năng bổ sung cho bắt đầu với 0 (và do đó tính Tổng).

Trong Scala, chúng ta có thể viết nó theo cách này:

(0 /: list) { (total, element) => total + element } 

có thể được đơn giản hóa để

(0 /: list) { _ + _ } 
+0

Điều này không tính đến các trùng lặp. Điều đó có quan trọng không? – PanCrit

+0

bạn có thể vui lòng giải thích cho tôi cách dòng cuối cùng hoạt động theo cách của nó quá lạ ????? trường hợp Nhóm (hình dạng @ _ *) => (0 /: hình dạng) {_ + size (_)} – tom

+0

@PanCrit: Tôi không thông thạo Scala - Bạn có thể giải thích ý nghĩa của từ * trùng lặp * không ? – Dario

17

Một trong những sẽ làm việc, thứ hai có lẽ là lựa chọn nếu một chút lạ lúc đầu liếc nhìn. Xem 8.1.9 Chuỗi mẫu từ Scala Reference.

case g: Group => g.shape.map(size(_)).sum 

case Group(ss @ _*) => ss.map(size(_)).sum 

Điều này đang sử dụng Scala 2.8. sum có thể không hoạt động trên các phiên bản cũ hơn.

+0

Điều này không tính đến các trùng lặp. Nó rất quan trọng? – PanCrit

+5

Giả thiết của tôi là câu hỏi là về sự khớp mẫu trong Scala chứ không phải là hình học. – retronym

2

Bước đầu tiên là tìm hiểu ý của bạn. Hai lựa chọn rõ ràng nhất là tổng diện tích được bao phủ bởi tất cả các hình dạng và hình chữ nhật tối thiểu chứa tất cả chúng. Nếu đối với các vòng kết nối bạn quay trở lại khu vực thực tế, họ có thể phải đi với khu vực thực tế.

Không có cách đóng biểu mẫu nào để trả lời câu hỏi này. Tôi có thể xem xét ném một ngàn phi tiêu ngẫu nhiên tại một hình chữ nhật kèm theo tối thiểu và ước tính diện tích là phần trăm phi tiêu đã đạt đến điểm bị chiếm đóng. Là một ước tính một phản ứng chấp nhận được?

Bạn có chắc chắn rằng tất cả các hình dạng sẽ là hình tròn và hình chữ nhật? Bạn có thể cobble cùng nhau một giải pháp mà sẽ làm việc cho họ. Nếu hình dạng có thể được mở rộng hơn nữa, thì điều đó sẽ không hoạt động.

0

trường hợp g:. Nhóm => g.shape.map (kích thước (_)) tổng

trường hợp Group (ss @*) => ss.map (kích thước ()).tổng

cả hai mang lại cho tổng giá trị lỗi không phải là một thành viên của Seq [Int]
Tuy nhiên Oen này hoạt động
trường hợp Group (hình dạng @ _ *) => (0 /: hình dạng) {_ + kích thước (_)

+2

Vui lòng không đăng câu hỏi dưới dạng câu trả lời nhưng hãy chỉnh sửa câu hỏi của bạn! – Dario

1

Đối với Vị trí kích thước nên khoan xuống để có được kích thước từ hình dạng có thể là nhóm gây ra một số cao hơn

trường hợp Địa điểm (x, y, hình dáng) => kích thước (hình dạng)

đó là nếu kích thước là số hình dạng trong Hình dạng

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