[英]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
文檔是正確的,那么seq
和evaluate
的行為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.