質問
今日、Haskellは頭痛の種です。例外を処理したい。トップに到達すると、次のように表示されます。
***例外:../p/trip/Trip.hs:(88,16)-(89,50):関数分割の網羅的でないパターン
私にはPatternMatchFailのように見えますが、これは機能しません:
handle (\(PatternMatchFail _) -> return env) f
つまり、コンパイルはされますが、例外は処理されません。何が間違っていますか?これは間違った例外ですか?例外をキャッチする方法はありますか?
解決
エラーの原因を修正することが選択肢にならない場合は、これを確認する必要があります。 http://www.haskell.org/ ghc / docs / latest / html / libraries / base / Control-Exception.html
" handle"の使用を信じています。または「試用」または" catch"またはControl.Exceptionのキーがここのキーである場合、標準プレリュードの関数はIO例外のみを処理し、純粋なコードのエラーは処理しません。
Haskell98では、純粋なコードは例外を処理できません。純粋な関数は値を返す必要があり、例外は値を返すことができないことです。
例:
import qualified Control.Exception as C
x ::String
x = undefined
y = "return value"
main = do C.handle (\_ -> return "caught") (C.evaluate x) >>= print
C.handle (\_ -> return "caught") (C.evaluate y) >>= print
evaluateの呼び出しは、xとyの評価を強制することであり、haskellは遅延し、すべてです。
xの評価を後で(怠lazに)延期させた場合、例外は後で別の場所でスローされます(この場合、値を使用するのは「印刷」です)。捕まる。
所属していません StackOverflow