2012-06-17 20 views
85

:Haskell'deki istisnalar nasıl çalışır? GHCi yılında

Prelude> error (error "") 
*** Exception: 
Prelude> (error . error) "" 
*** Exception: *** Exception: 

Neden İlki iç içe geçmiş istisna değil mi?

+9

Bu, bir GHC'nin yapmasına izin verilen bir dönüşümdür: "Kendisi tarafından çalışan Derleyici benim ve tüm _ | _s bana benzer". Bu iki satırı farklı şekilde derleyen uygulama detaylarını mı soruyorsunuz? – shachaf

+3

'error' özeldir ve gerçekten bir istisna mekanizması değildir. Gerçek, katılabilir istisnalar için bkz. ['Error'] (http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Error.html) monad. –

+1

Örneğin, '(\ f g x -> f (g x)) hata hatası" "', '(.) Hata değerinden farklı bir şekilde davranır. Belki de Prelude'un derlendiği optimizasyon bayraklarıyla ilgilidir. – shachaf

cevap

99

yanıt (bu kesin istisna saf kod olağanüstü değerleri ayarlamak değerlendirmek için gösterilebilir

arasında (biraz şaşırtıcıdır) anlam olmasıdır yani error veya undefined değeri, ve açıkça değil istisnalar generated in IO), sonra dil, bu kümenin herhangi bir değerinin iade edilmesine izin verir. Haskell'deki istisnai değerler, zorunlu dillerdeki kontrol akışına dayalı istisnalar yerine, kayan nokta kodunda NaN gibidir.

bile ileri Haskellers için bir arada yakaladım bir vaka gibi geçerli: kod bir dizi istisna olarak değerlendirilen

case x of 
    1 -> error "One" 
    _ -> error "Not one" 

beri GHC seçeceğiz serbesttir. En iyi duruma getirme ile, her zaman "Bir değil" olarak değerlendirirsiniz.

Bunu neden yapıyoruz? Aksi halde, dilin değerlendirme sırasını aşırı derecede zorlayacağız, ör. biz bir deterministik bir sonuç düzeltmek gerekir: tarafından

f (error "a") (error "b") 

örneğin hata değerleri varsa o soldan sağa değerlendirilecektir gerektiren. Çok beceriksiz!

error'u desteklemek için kodumuzda yapılabilecek en iyileştirmeleri saklamak istemediğimizden, çözüm, sonuçların istisnai değerler kümesinden deterministik olmayan bir seçim olduğunu belirtmektir: kesin olmayan istisnalar! Bir şekilde, tüm istisnalar geri döndü ve biri seçildi.

Normalde, umurumda değil - istisnanın bir istisnasıdır - istisna içindeki dizeyi önemsemediğiniz sürece, bu durumda error hata ayıklaması oldukça karışıktır.


Referanslar: A semantics for imprecise exceptions Simon Peyton Jones, Alastair Reid, Tony Hoare, Simon Marlow, Fergus Henderson. Proc Programlama Dilleri Tasarım ve Uygulaması (PLDI'99), Atlanta. (PDF)

+0

Bu, GHC'nin neden iki farklı seçim yapmasına izin verildiğinin harika bir açıklamasıdır, teşekkürler! Yine de, bu özgürlüğü neden uyguladığı, bunun açıklaması nedir? Bu ifadeler çok benzer gözüküyor! –

+1

GHC'nin karşılaşılabilecek istisnalardan birini seçtiğini anlıyorum. Ama "durumda" örneğinizde, "Bir değil" istisnası, 1 girdisi ile karşılaşılamaz, bu yüzden hala bir hata olarak sınıflandırırdım. – Peaker

+8

@Peaker dead code elim - optimizer bir hata olduğunu görmek için x'e bakmak zorunda değildir, tüm dallar "aynı" değeri üretir, bu yüzden giriş değerini tamamen yok sayabilir. Kesin olmayan istisnalar altında bir hata değil! –