我有一些看起来像这样的代码:
retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ResponseTimeout ->
do putStrLn "Timed out. Trying again."
threadDelay 5000000
action
问题是HttpException还有很多其他的构造函数,我想一般再试一次,不管错误到底是什么。现在,如果我用ResponseTimeout
替换_
,那么我将收到编译错误,因为它无法推断出异常的类型。
我真的不想为异常处理程序提供类型签名。
我知道它不是很多重复,但为_
添加一个案例感觉不对,因为它就像是说:如果异常是ResponseTimeout然后做x,但如果异常是其他的做同样的事情。是否有一种使用通配符的简洁方法,但仍然让编译器知道它是哪种类型?
答案 0 :(得分:6)
如果你不关心异常值,那么使用_
就完全没了问题,但你需要使用ScopedTypeVariables
或let子句来指定你想要的类型。
{-# LANGUAGE ScopedTypeVariables #-}
retryOnTimeout :: IO a -> IO a
retryOnTimeout action = catch action $ \ (_ :: HttpException) -> do
putStrLn "Timed out. Trying again."
threadDelay 5000000
action