2011-03-17 75 views
7

Tôi đang cố gắng loại trừ ngoại lệ do có hành động ([1,2] !! 3). Tôi không thể.Haskell. Xử lý ngoại lệ không IO

Tôi đã cố gắng

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)

trong cả tôi nhận được Ngoại lệ: Prelude (!!). Chỉ số quá lớn *

Có thể không? Có lẽ tôi đang sử dụng Có lẽ cách tiếp cận.

Cảm ơn bạn đã trợ giúp.

Trả lời

7

Sự lười biếng và ngoại lệ, như lười biếng và song song, tương tác theo những cách tinh tế!

return kết thúc truy cập mảng của bạn trong một đoạn, để nó được trả về không được đánh giá, khiến cho ngoại lệ được đánh giá bên ngoài trình xử lý.

Giải pháp là đảm bảo đánh giá return cũng phải đánh giá chỉ mục danh sách. Điều này có thể được thực hiện thông qua $! trong trường hợp này: - (! Return $ một !! 3)

xử lý ((e :: SomeException)> print "err" >> trở lại 1)

+0

" đánh giá 'return' cũng phải đánh giá chỉ mục danh sách" - đây là cách phân tích tốt để suy nghĩ về độ nghiêm ngặt. +1 – luqui

+0

đôi khi tôi quên đi sự lười biếng của haskell – Anton

4

Điều này thường có nghĩa là mã của bạn quá lười và điều này xảy ra sau khi trình xử lý trả về. Hãy thử sử dụng $! thay vì $ để buộc đánh giá.