У меня есть код, который выглядит так:
retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ResponseTimeout ->
do putStrLn "Timed out. Trying again."
threadDelay 5000000
action
Проблема в том, что существует множество других конструкторов HttpException, и я хотел бы, как правило, продолжать попытки снова, независимо от того, в чем именно заключается ошибка. Теперь, если я заменю ResponseTimeout
на _
, я получу ошибку компиляции, потому что он не может определить тип исключения.
Я действительно не хочу предоставлять сигнатуру типа для обработчика исключений.
Я знаю, что это не большое дублирование, но добавление случая для _
кажется неправильным, потому что это все равно, что сказать: если исключение — ResponseTimeout, то сделайте x, но если исключение — что-то еще, сделайте точно то же самое вещь. Есть ли краткий способ использовать подстановочный знак, но при этом сообщить компилятору, какой это тип?
catch action $ \ (_ :: HttpException) -> do ...
? Возможно, для компиляции необходимо включитьScopedTypeVariables
. - person Nathan Howell   schedule 10.08.2013\~ResponseTimeout ->
, который связывает тип без фактического сопоставления, поскольку~
— это ленивый шаблон. ОднакоScopedTypeVariables
— гораздо лучшее решение. - person Neil Mitchell   schedule 13.08.2013