gpt4 book ai didi

haskell - Haskell 的 'evaluate' 是否减少到正常或 WHNF?

转载 作者:行者123 更新时间:2023-12-04 05:37:29 25 4
gpt4 key购买 nike

我了解 ( I think ) Haskell 的 seq ,将(通常)reduce它的第一个参数 WHNF ,并在 GHCi 中看到这种行为:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in seq x 0
foo
0

然而,尽管 documentation for 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

关于haskell - Haskell 的 'evaluate' 是否减少到正常或 WHNF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com