GHCi'de:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
İlki neden iç içe geçmiş bir istisna değil?
GHCi'de:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
İlki neden iç içe geçmiş bir istisna değil?
error
özeldir ve gerçekten bir istisna mekanizması değildir. Gerçek, yakalanabilir istisnalar için Error
monad'a bakınız .
(\f g x -> f (g x)) error error ""
farklı davrandığına (.) error error ""
dikkat edin (.)
. Belki de Prelude'un derlendiği optimizasyon bayraklarıyla ilgisi vardır.
iterate error "" !! n
ve harika fix error
.
error = error
ve buna göre programlıyorum.
Yanıtlar:
Cevap, bunun belirsiz istisnaların (biraz şaşırtıcı) semantiği olmasıdır.
Saf kod a değerlendirmek gösterilebilir zaman setinin olağanüstü değerlerden (değerini yani error
ya undefined
ve açıkça değil istisnalar tür IO üretilen ), sonra dil o setin herhangi bir değer döndürülecek izin verir. Haskell'deki istisnai değerler NaN
, zorunlu dillerdeki kontrol akışına dayalı istisnalardan ziyade kayan nokta kodundaki gibidir .
Hatta gelişmiş Haskeller'lar için ara sıra karşılaşılan bir durum aşağıdaki gibi bir durumdur:
case x of
1 -> error "One"
_ -> error "Not one"
Kod bir dizi istisna olarak değerlendirildiğinden, GHC birini seçmekte özgürdür. Optimizasyonlar açıkken, bunun her zaman "Bir değil" olarak değerlendirildiğini fark edebilirsiniz.
Bunu neden yapıyoruz? Çünkü aksi takdirde, dilin değerlendirme sırasını aşırı derecede kısıtlardık, örneğin aşağıdakiler için deterministik bir sonuç düzeltmemiz gerekirdi:
f (error "a") (error "b")
Örneğin, hata değerleri varsa soldan sağa değerlendirilmesini gerektirerek. Hiç küstahça!
Sadece desteklemek için kodumuzda yapılabilecek optimizasyonları sakatlamak istemediğimizden error
, çözüm, sonucun istisnai değerler kümesinden belirleyici olmayan bir seçim olduğunu belirtmektir: kesin olmayan istisnalar! Bir bakıma, tüm istisnalar iade edilir ve biri seçilir.
Normalde umursamazsınız - istisna bir istisnadır - istisnanın içindeki dizeyi önemsemediğiniz sürece, bu durumda error
hata ayıklamak için kullanmak oldukça kafa karıştırıcıdır.
Kaynaklar: Kesin olmayan istisnalar için bir anlambilim , Simon Peyton Jones, Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson. Proc Programlama Dilleri Tasarımı ve Uygulaması (PLDI'99), Atlanta. ( PDF )
throw
) ve belirleyici olarak bir istisna atabileceğinizi düşünüyorum throwIO
.
case error "banana" of (x:xs) -> error "bonobo"
sana verebilirim * Exception: bonobo
.