Haskell。非IO异常处理
问题描述:
我想捕捉异常,因为与行动([1,2] !! 3)。我不能。Haskell。非IO异常处理
我试图
let a = [1,2]
handle (\(e :: SomeException) -> print "err" >> return 1) (return $ a !! 3)
Control.Exception.catch (return $ a !! 3) (\(e::SomeException) -> print "err" >> return 1)
两个我得到例外:前奏曲(!!):指数太大 *
这可能吗?可能我会用Maybe方法。
感谢您的帮助。
答
懒惰和例外,如懒惰和平行,以微妙的方式相互作用!
return
将您的数组访问包装在一个thunk中,以便返回未评估的值,从而导致异常在处理程序之外进行评估。
解决方案是确保评估return
也必须评估列表索引。这可以通过$!
在这种情况下可以选择: - (!$返回一个!! 3)
手柄((E :: SomeException)>打印 “ERR” >>返回1)
答
这通常意味着您的代码太懒,并且处理程序返回后发生取消引用。尝试使用$!
而不是$
来强制评估。
“评估'return'还必须评估列表索引“ - 这是考虑严格性的好语言。 +1 – luqui 2011-03-17 23:22:45
有时我会忘记哈斯克尔的懒惰 – Anton 2011-03-18 05:22:52