1

次のようなコードを取得しました。

setA :: Integer -> Integer
setA 3 = 5
setA 5 = 6
setA 7 = error "some error one"
setA _ = error "some error two"

今、私は別の関数を書き込もうとしています

checkError :: Integer -> Bool
checkError x = if HERE_TO_CHECK_IF setA x RETURNS some error two
                then False
                else True

しかし、どうすればこれを行うことができますか?

ありがとう

4

4 に答える 4

3

私が理解しているように、error呼び出しは呼び出し元によってキャッチされることを意図していません-エラーを回復可能にしたい場合、setA関数は他のメカニズム(のようなEither)を使用する必要があります。をキャッチすることを主張する場合errorは、IO モナド内で行うことができます。この関連する質問を参照してください。

于 2013-04-30T09:05:41.040 に答える
1

回復不能な不良状態errorにのみ使用する必要がありますが (キャッチする必要はありません)、エラー コールをキャッチする正確な例を次に示します。

しかし、これはデバッガーを書く以外の方法ではないと思います:

{-# LANGUAGE ScopedTypeVariables #-}
import Prelude hiding (catch)
import Control.Exception

setA :: Integer -> Integer
setA 3 = 5
setA 5 = 6
setA 7 = error "some error one"
setA _ = error "some error two"

main = do
  (print $ setA 9)
  `catch` (\(ErrorCall msg) -> putStrLn $ "I caught you, ErrorCall: " ++ msg)
  `catch` (\(exc::SomeException) -> putStrLn $ "Other exception: " ++ show exc)

通常のプログラミングではEither、他の回答で説明されているように、可能性のある誤った結果を type でラップします。

于 2013-05-01T11:37:36.330 に答える