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)?
Bu arada, polimorfik olarak (tip sınıfsız) WHNF'nin ötesinde bir değeri değerlendirmenin hiçbir yolu yoktur. –
@ReidBarton: Bunu biraz daha açıklayabilir misiniz (ya da bu [http://stackoverflow.com/a/33070412/656912)]? – orome
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) –