質問

今日、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に)延期させた場合、例外は後で別の場所でスローされます(この場合、値を使用するのは「印刷」です)。捕まる。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top