将列表评估为弱头范式

时间:2015-06-17 18:01:45

标签: list haskell

从1到100给出以下列表:

> let x = [1..100]

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

> :sprint x
x = _

然后,我运行seq将其评估为弱头正常形式:

> seq x ()
()

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

> :sprint x
x = _

为什么?

1 个答案:

答案 0 :(得分:1)

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

  

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

David Young补充说明,当启用单态限制时,这个问题不会发生在早于7.8的GHCi版本上。