2012-01-08 45 views
14

Tôi muốn triển khai kịch bản sau đây trong Haskell. Tôi có một bộ đếm được của 'sự kiện' định nghĩa như thế này:Xử lý sự kiện trong Haskell

data MyEvent = Event1 
      | Event2 
      | Event3 

Tôi muốn xác định xử lý cho những sự kiện này sẽ được sử dụng theo cách sau:

eventLoop :: Handler h => h -> IO() 
eventLoop currentHandler = do 
    event <- getNextEvent 
    nextHandler <- currentHandler event 
    eventLoop nextHandler 

Về cơ bản tôi muốn xử lý được có thể tự trả lại hoặc xử lý khác để xử lý các sự kiện trong tương lai. Đó là loại xử lý mà tôi không chắc chắn.

ý tưởng đầu tiên của tôi là để xác định xử lý như các chức năng đơn giản, nhưng kiểu của họ sẽ được dài vô hạn:

myHandler :: Event -> IO (Event -> IO (Event -> ...)) 

Tôi nghi ngờ điều này có thể được giải quyết với một lớp loại, trong đó mỗi bộ xử lý sẽ cần để thực hiện một hàm để xử lý các sự kiện (mà lần lượt trả về một kiểu khác là cùng một lớp), nhưng định nghĩa đệ quy vẫn sẽ áp dụng. Ai đó có thể thông thạo hơn trong hệ thống kiểu điểm tôi đi đúng hướng không? Tôi cũng chào đón bất kỳ sự khác biệt nào về điều này.

Cảm ơn!

+0

Tôi nghĩ 'MyHandler :: [Sự kiện] -> [IO()]' và 'eventLoop :: ([Sự kiện] -> [IO()]) -> IO()' có thể là một cách tiếp cận tốt hơn. – RnMss

Trả lời

17

Vâng, các loại "vô hạn" thường tính đến các loại đệ quy chưa được kiểm soát. Vì vậy, có một điều bạn có thể làm là làm cho đệ quy rõ ràng sử dụng một newtype:

newtype Handler = Handler { runHandler :: Event -> IO Handler } 

Đây cũng là lẽ là giải pháp đơn giản nhất, bởi vì nó tránh được sự cần thiết phải sắp xếp các lớp học kiểu và các trường hợp khác nhau để có được behaviors-- khác nhau mỗi người xử lý có thể chọn những gì nó trả về, vì họ có một giao diện thống nhất.

Lưu ý rằng, trong nhiều trường hợp, việc xác định loại lớp để giải quyết loại vấn đề này hoàn toàn không cần thiết. Nếu bạn đang xử lý một loại đa hình Handler h => h, tất cả những gì bạn có thể làm với loại đó là sử dụng các chức năng của lớp loại trên đó. Nếu các hàm được định nghĩa trong lớp kiểu đó là đơn giản, bạn có thể tiết kiệm cho mình rất nhiều rắc rối bằng cách khái niệm "áp dụng trước" chúng.

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