4

次のようなコードがあります。

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

問題は、HttpException のコンストラクターが他にもたくさんあることです。エラーが正確に何であるかに関係なく、通常は再試行を続けたいと思います。次に置き換えるResponseTimeout_、例外のタイプを推測できないため、コンパイル エラーが発生します。

例外ハンドラにも型シグネチャを提供したくありません。

あまり重複していないことはわかってい_ますが、「例外が ResponseTimeout の場合は x を実行し、例外がそれ以外の場合はまったく同じことを実行する」と言っているようなものなので、ケースを追加するのは間違っていると感じます。ワイルドカードを使用する簡潔な方法はありますが、それがどのタイプであるかをコンパイラに知らせますか?

4

1 に答える 1

6

例外値を気にしない場合は、使用してもまったく問題ありませんが、または let 句を_使用して必要な型を指定する必要があります。ScopedTypeVariables

{-# 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 に答える