评估名单弱头正常形式

从1到100给出以下列表:

> let x = [1..100]

我运行sprint x观察其未评估的价值。

> :sprint x
x = _

然后,我运行seq来评估它为弱首标范式:

> seq x ()
()

但重新运行sprint x显示(我认为)是相同的价值。

> :sprint x
x = _

这是为什么?


我认为这个bheklilr的评论应该被标记为答案:

x的类型是什么? 如果它是(Num a, Enum a) => [a]那么这将无法按预期工作。 试试let x = [1..100] :: [Int ]。 实际上,当您用更普通的类型打印x时,GHCi专门将其转换为整数来进行打印。 这意味着您看到的打印值实际上并没有存储在x的thunk中。 使用具体类型可以避免这个问题。

有了David Young的补充说明,在启用单态限制时,GHCi版本早于7.8版本时不会出现此问题。

链接地址: http://www.djcxy.com/p/43019.html

上一篇: Evaluating List to Weak Head Normal Form

下一篇: Observing lazyness in Haskell