【问题标题】:Evaluating List to Weak Head Normal Form评估列表到弱头范式
【发布时间】: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 评论应该是答案 - 只是一个小小的观察:当我把它变红时,看起来问题可能是Integer vs Int - 这不是批评,而是只是我想了一会儿:“Integer 有什么问题吗?) - 所以也许你可以把它重命名为[1..100] :: [Integer]?(对不起)
  • @CommuSoft 您必须将其放入文件中然后加载它,或者您使用的是 7.8 之前版本的 GHCi。在这些情况下,单态限制将被打开。

标签: list haskell


【解决方案1】:

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

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

David Young 补充说,当启用单态限制时,7.8 之前的 GHCi 版本不会出现此问题。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2011-10-15
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多