Haskell的“评估”会降低到正常还是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
的行为不应该是相同的吗? 我在这里错过了什么(作为Haskell初学者)?
缺少的是,GHCi还打印IO操作的结果(如果它们可以显示而不是()
),这会导致它评估为正常形式。 改为:
λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x >> return ()
foo
链接地址: http://www.djcxy.com/p/42985.html