3

今日は Haskell が頭を悩ませています。例外を処理したい。トップに到達すると、次のように出力されます。

*** 例外: ../p/trip/Trip.hs:(88,16)-(89,50): 関数分割の非網羅的なパターン

私にはそれが PatternMatchFail のように見えますが、これは機能しません:

handle (\(PatternMatchFail _) -> return env) f

つまり、コンパイルはしますが、例外を処理しません。私は何を間違っていますか?これは間違った例外ですか、それとも何ですか? 例外をキャッチする方法はありますか?

4

1 に答える 1

1

エラーの原因を修正できない場合は、これを確認する必要があります: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html

「ハンドル」、「トライ」、「キャッチ」など、Control.Exception の使用がここで重要だと思います。標準プレリュードの関数は、純粋なコードのエラーではなく、IO-Exceptions のみを処理します。

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 の評価を後で (遅延して) 延期すると、例外も後で別の場所 (この場合、値を使用するのは「print」) でスローされ、キャッチされない可能性があります。

于 2009-01-04T22:04:50.687 に答える