繁体   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