2011-03-17 90 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

這通常意味着您的代碼太懶,並且處理程序返回後發生取消引用。嘗試使用$!而不是$來強制評估。