Haskell今天让我很头疼。我想处理一个例外。当它到达顶部时,它打印如下:
***例外:../ p / trip / Trip.hs :(88,16) - (89,50):功能拆分中的非详尽模式
对我而言,它看起来像是PatternMatchFail,但这不起作用:
handle (\(PatternMatchFail _) -> return env) f
我的意思是,它编译,但不处理异常。我究竟做错了什么?这是错误的例外还是什么?有没有办法捕捉到任何异常?
答案 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”),它可能不是捕获。