Обработка событий в Haskell

Я хотел бы реализовать следующий сценарий на языке Haskell. У меня есть перечислимый набор "событий", определенных следующим образом:

data MyEvent = Event1
             | Event2
             | Event3

Я хочу определить обработчики для этих событий, которые будут использоваться следующим образом:

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

В основном я хочу, чтобы обработчики могли возвращать себя или другой обработчик для обрабатывать будущие события. Я не уверен в типе обработчиков.

Моей первой идеей было определить обработчики как простые функции, но их тип стал бы получился бы бесконечно длинным:

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

Я подозреваю, что это можно решить с помощью класса типов, где каждый обработчик должен будет реализовать функцию для обработки событий (которая, в свою очередь, возвращает другой тип из того же класса), но рекурсивное определение будет по-прежнему применимо. Может ли кто-нибудь более хорошо разбирающийся в системе типов, направить меня в правильном направлении? Я также приветствую любые другие мнения на этот счет.

Спасибо!

14
задан akosch 8 January 2012 в 18:44
поделиться