2010-01-16 48 views
15

Kết hợp mẫu là một trong những tính năng Haskell thanh lịch nhất.Mẫu phù hợp với Seq ở Haskell

Tôi đã làm việc trên một dự án gần đây, nơi tôi cần cấu trúc dữ liệu hàng đợi vì vậy tôi đang sử dụng Data.Sequence. Tuy nhiên, có vẻ như tôi phải từ bỏ sự sang trọng của mô hình kết hợp và nghỉ mát để bảo vệ:

floodFillWorker :: Image -> RGBAColor -> Double -> PixelQueue -> Image 
floodFillWorker image base tolerance queue 
    | Seq.null queue = image 
    | otherwise  = doSomeWork image 

Tôi có thể sử dụng mô hình phù hợp với trình tự hay tôi cần phải sử dụng bảo vệ?

Trả lời

17

ephemient đang đi đúng hướng với các kiểu xem nhưng tôi nghĩ có cách để thực hiện điều đó thực sự khá tốt đẹp. Data.Sequence thực sự được viết với quan điểm trong tâm trí và bạn nên sử dụng các loại ViewL hoặc ViewR để tạo mẫu trên cấu trúc dữ liệu.

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.viewl -> EmptyL) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
+0

Cảm ơn! Tôi cũng có thể sử dụng nó để phù hợp với mô hình cho mặt trận và phần còn lại, như tôi sẽ với một danh sách? ví dụ: floodFillWorker _ _ _ (đầu tiên: phần còn lại) = .... – Bill

+0

Tôi đã cân nhắc việc chỉ ra điều này, nhưng có vẻ như OP không thực sự muốn giải mã trình tự ở đây. Nhưng nếu nó hoạt động, thì điều này là tốt. – ephemient

+0

Xin lỗi, câu hỏi ban đầu của tôi chỉ được xác định một nửa. Cảm ơn bạn đã làm rõ! – Bill

6

Bạn có thể sử dụng view patterns thay vì bảo vệ, nhưng thực ra không tốt hơn (IMO). Các lính canh trông ổn với tôi ...

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.null -> True) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
Các vấn đề liên quan