2011-03-17 93 views
7

我想捕捉异常,因为与行动([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方法。

感谢您的帮助。

回答

7

懒惰和例外,如懒惰和平行,以微妙的方式相互作用!

return将您的数组访问包装在一个thunk中,以便返回未评估的值,从而导致异常在处理程序之外进行评估。

解决方案是确保评估return也必须评估列表索引。这可以通过$!在这种情况下可以选择: - (!$返回一个!! 3)

手柄((E :: SomeException)>打印 “ERR” >>返回1)

+0

“评估'return'还必须评估列表索引“ - 这是考虑严格性的好语言。 +1 – luqui 2011-03-17 23:22:45

+0

有时我会忘记哈斯克尔的懒惰 – Anton 2011-03-18 05:22:52

4

这通常意味着您的代码太懒,并且处理程序返回后发生取消引用。尝试使用$!而不是$来强制评估。