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

于 2009-01-04T22:04:50.687 回答