2015-10-12 39 views
8
anlıyorum

GHCi beklendiği gibi Haskell seq, will (genellikle) reduce ilk argüman WHNF için ve bu davranışı (bkz I think):Haskell'in 'değerlendirmesini' normal veya WHNF'ye düşürüyor mu?

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in seq x 0 
foo 
0 

Ancak documentation for evaluate aynı zamanda onun argüman azalttığını söylüyor olsa da,

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x 
foo 
Foo bar 
(Bar 100) 

Ben

012 ile bu (görünen) tutarsızlık onaylayabilirsiniz: aslında tamamen normal bir forma argümanını azaltır gibi WHNF için, görünüşe
λ> let y = (trace "foo" Foo (trace "bar" Bar 100)) 
λ> seq y 0 
foo 
0 
λ> :sprint y 
y = <Foo> _ 

ve evaluate için dokümantasyon doğruysa

λ> let z = (trace "foo" Foo (trace "bar" Bar 100)) 
λ> evaluate z 
foo 
Foo bar 
(Bar 100) 
λ> :sprint z 
z = <Foo> (<Bar> 100) 

, seq ve evaluate davranışı aynı olması gerekmez mi? Burada ne eksik (Haskell başlangıç ​​olarak)?

+1

Bu arada, polimorfik olarak (tip sınıfsız) WHNF'nin ötesinde bir değeri değerlendirmenin hiçbir yolu yoktur. –

+0

@ReidBarton: Bunu biraz daha açıklayabilir misiniz (ya da bu [http://stackoverflow.com/a/33070412/656912)]? – orome

+2

Bu bağlantıdakiyle aynı değil, yalnızca bir tür sınıfı olmadan, bilinmeyen bir değerin alt bölümlerine nasıl erişileceği hakkında bilgi almanın hiçbir yolu yoktur. (Hm, yüksek seviyeli bir yol yok, yine de - çöp toplayıcısının verilerini kullanarak bazı tehlikeli olmayan yollardan bazıları olabilir) –

cevap

15

Ne eksik GHCi da yapar baskılar (gösterildikleri ve () değildir edilebilirse) IO işlemlerin sonuçlarına, normal forma değerlendirmek sebep olmasıdır. Bunun yerine:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x >> return() 
foo 
+0

Mükemmel! Mesaj yazdığımda bunu merak ettim, ama hala IO eylemleri ve nasıl çalıştıkları konusunda yeterince muğlakım (özellikle GHCi ile etkileşimde oldukları için “gömülü olduklarında”). – orome