簡體   English   中英

Haskell的“評估”是否會降低到正常水平或WHNF?

[英]Does Haskell's 'evaluate' reduce to normal or WHNF?

我理解( 我認為 )Haskell的seq將(通常) 其第一個參數減少WHNF ,並在GHCi中看到這種行為:

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

但是,雖然evaluate文檔說它也減少了它對WHNF的參數,但看起來它實際上完全將它的參數減少到正常形式:

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

我可以確認這個(明顯的)差異

λ> let y = (trace "foo" Foo (trace "bar" Bar 100))
λ> seq y 0
foo
0
λ> :sprint y
y = <Foo> _

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

如果evaluate文檔是正確的,那么seqevaluate的行為evaluate應該相同? 我在這里缺少什么(作為Haskell初學者)?

您缺少的是GHCi還會打印 IO操作的結果(如果它們可以顯示而不是() ),這導致它評估為正常形式。 嘗試改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM