4

我有一些看起来像这样的代码:

retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ResponseTimeout -> 
                            do putStrLn "Timed out. Trying again."
                               threadDelay 5000000
                               action 

问题是还有很多其他的 HttpException 构造函数,我通常会继续尝试,不管错误到底是什么。现在如果我替换ResponseTimeout_then 我会得到一个编译错误,因为它不能推断出异常的类型。

我也不想为异常处理程序提供类型签名。

我知道这并没有太多重复,但是添加一个案例_感觉不对,因为它就像是在说:如果异常是 ResponseTimeout 则执行 x,但如果异常是其他任何事情,则执行完全相同的操作。有没有一种使用通配符的简洁方法,但仍然让编译器知道它是哪种类型?

4

1 回答 1

6

如果您不关心异常值,它完全可以使用_,但您需要使用ScopedTypeVariablesor 一个 let 子句来指定您想要的类型。

{-# LANGUAGE ScopedTypeVariables #-}

retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ (_ :: HttpException) -> do
  putStrLn "Timed out. Trying again."
  threadDelay 5000000
  action
于 2013-08-10T18:43:14.870 回答