[英]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.