2011-03-17 21 views
7

Eylem nedeniyle özel durum yakalamaya çalışıyorum ([1,2] !! 3). Yapamam.Haskell. IO Kural dışı durum işleme

ben hem de

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)

çalışıyordu i İstisna olsun: Prelude (!!). Endeksi çok büyük *

Mümkün mü? Muhtemelen belki yaklaşımını kullanacağım.

Yardımlarınız için teşekkürler.

cevap

7

Tembellik ve istisnalar, tembellik ve paralellik gibi, ince yollarla etkileşime girer!

return dizisi erişiminizi bir thunk içinde tamamlar, böylece geri döndürülemeyen şekilde döndürülür ve bu durum istisnanın işleyici dışında değerlendirilmesine neden olur. Çözüm, return değerlendirmesinin liste dizinini de değerlendirmesini sağlamalıdır. Bu, bu durumda $! aracılığıyla yapılabilir: - (! Dönüş $ a !! 3)

kolu ((e :: SomeException)> print "err" >> dönüş 1)

+0

" 'return' değerlendirmek de liste dizinini değerlendirmelidir '- bu, katılık hakkında düşünmek için iyi bir ifadedir. +1 – luqui

+0

bazen haskell tembelliklerini unuttum – Anton

4

Bu, genellikle kodunuzun çok tembel olduğu ve işleyicinin geri döndükten sonra geçersiz kılınacağı anlamına gelir. Değerlendirmeye zorlamak için $ yerine $! kullanmayı deneyin.

İlgili konular