вот моя проблема
Я использую Control.Exception.catch для обработки исключений следующего типа: (выбрано из Hoogle)
catchSource
:: Exception e
=> IO a
The computation to run
-> (e -> IO a)
Handler to invoke if an exception is raised
-> IO a
Вот конструктор, который я передам своей функции-обработчику.
> data JobException = PreProcessFail
> | JobFail
> | ChartFail
> deriving (Show, Typeable)
> instance Control.Exception JobException
Вот функция Handler, как она есть сейчас:
> exceptionHandler :: JobException -> IO ()
> exceptionHandler exception = do
> writeFile "testException.txt" ("caught exception " ++ show exception )
Я собираюсь использовать это, чтобы вести журнал. Информация, которую мне нужно зарегистрировать, будет в записи типа JobState.
> type JobState = MVar ProcessConfig
> data ProcessConfig = PConfig { model :: ServerModel
> , ipAddress :: String
> , cookie :: Cookie
> } deriving Show
Итак, поскольку мне нужен обработчик, который принудительно имеет тип, упомянутый выше, и мне нужен JobState, я подумал, что ответ будет заключаться в том, чтобы переписать JobException, чтобы скрыть внутри него JobState. Кажется, это работа для GADT! Я не уверен, это новая территория.
Я прав? Могу ли я решить эту проблему с помощью GADT? Может ли кто-нибудь подсказать, как начать его строить? Учебники, которые я читал, предполагают, что вы пытаетесь решить более сложную проблему, чем та, что есть у меня.
Если я ошибаюсь, может ли кто-нибудь указать мне правильное направление?
обновление: я узнал о динамических типах из 1 и нашел вскоре после этого Data.Dynamic. Становится теплее?