【发布时间】:2015-09-03 03:02:03
【问题描述】:
给定以下从 1 到 100 的列表:
> let x = [1..100]
我运行sprint x 来观察它的未评估值。
> :sprint x
x = _
然后,我运行 seq 将其评估为弱头范式:
> seq x ()
()
但重新运行 sprint x 显示(我认为)是相同的值。
> :sprint x
x = _
这是为什么呢?
【问题讨论】:
-
x的类型是什么?如果是(Num a, Enum a) => [a],那么这将无法按预期工作。试试let x = [1..100] :: [Int]。实际上,当您使用更通用的类型打印x时,GHCi 会将其专门用于Integer进行打印。这意味着您看到的打印值实际上并未存储回x的thunk 中。使用具体类型可以避免这个问题。 -
一次,由于可怕的单态限制的缺乏而引起的问题! :-)
-
这就是默认设置的常见偏见:默认设置的缺点将比优点更加突出。
-
我认为@bheklilr 评论应该是答案 - 只是一个小小的观察:当我把它变红时,看起来问题可能是
IntegervsInt- 这不是批评,而是只是我想了一会儿:“Integer有什么问题吗?) - 所以也许你可以把它重命名为[1..100] :: [Integer]?(对不起) -
@CommuSoft 您必须将其放入文件中然后加载它,或者您使用的是 7.8 之前版本的 GHCi。在这些情况下,单态限制将被打开。