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文件是正确的, seqevaluate的行为不应该是相同的吗? 我在这里错过了什么(作为Haskell初学者)?


缺少的是,GHCi还打印IO操作的结果(如果它们可以显示而不是() ),这会导致它评估为正常形式。 改为:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x >> return ()
foo
链接地址: http://www.djcxy.com/p/42985.html

上一篇: Does Haskell's 'evaluate' reduce to normal or WHNF?

下一篇: Haskell: foldl' accumulator parameter