4

このコードが動作する理由

import qualified Control.OldException as E

しかし、一緒ではありません

import qualified Control.Exception as E

コードは次のとおりです。

    fileContents <- (readFile "shpm.txt") `E.catch` (\_ -> return "")

「新しい」例外で発生するエラーは次のとおりです

Ambiguous type variable `e0' in the constraint:
  (E.Exception e0) arising from a use of `E.catch'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' block:
  fileContents <- (readFile "shpm.txt")
                  `E.catch` (\ _ -> return "No Tasks")
4

2 に答える 2

9

種類が変わったからです。具体的には:

  • 古い例外:catch :: IO a -> (Exception -> IO a) -> IO a
  • 例外:catch :: Exception e => IO a -> (e -> IO a) -> IO a

新しいモデルはeException e型の値が何であるかを知る必要があります。これが実際に意味することは、キャッチする例外をコンパイラーに伝える必要があるということです。あなたの例はOldExceptionすべてをキャッチしますが、現在は推奨されていません (詳細については、すべての例外のキャッチを参照してください)。

関数の簡単な修正は次のようになります。

foo = (readFile "foo") `E.catch` (\e -> const (return "") (e :: E.IOException))

またはラムダなしのバージョン:

bar = (readFile "foo") `E.catch` myHandler

myHandler :: E.IOException -> IO String
myHandler _ = return ""
于 2012-09-07T05:23:12.427 に答える
1

キャッチされる例外の明示的な型を指定する必要があります。例えば:

fileContents <- (readFile "shpm.txt") `E.catch` ((\_ -> return "") :: E.SomeException -> IO String)
于 2012-09-07T05:21:29.460 に答える