如何处理这个异常?

时间:2009-01-04 20:44:49

标签: exception haskell

Haskell今天让我很头疼。我想处理一个例外。当它到达顶部时,它打印如下:

***例外:../ p / trip / Trip.hs :(88,16) - (89,50):功能拆分中的非详尽模式

对我而言,它看起来像是PatternMatchFail,但这不起作用:

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

我的意思是,它编译,但不处理异常。我究竟做错了什么?这是错误的例外还是什么?有没有办法捕捉到任何异常?

1 个答案:

答案 0 :(得分:1)

如果无法修复错误来源,您应该看一下: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html

我相信在Control.Exception中使用“handle”或“try”或“catch”或其他任何东西是关键,标准前奏中的函数只处理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

评估的调用是强制评估x和y,haskell是懒惰的。

如果你将x的求值推迟到稍后(懒惰),异常也将在稍后的某个地方抛出(在这种情况下它是使用该值的“print”),它可能不是捕获。