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
我相信使用 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 的评估推迟到稍后(懒惰地),该异常也将稍后抛出,在不同的地方(在这种情况下,它是使用该值的“打印”),它可能不会被捕获。