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