【问题标题】:Understanding `seq` with Example [duplicate]用示例理解`seq` [重复]
【发布时间】:2015-06-18 03:02:36
【问题描述】:

我试图通过以下示例理解seq

Prelude> let x = 100 + 2

sprint-ing x 的值显示_,因为它尚未被评估。

Prelude> :sprint x
x = _

让我们,据我了解seq,评估x

Prelude> seq x ()
()

现在,让我们检查x 的值。

Prelude> :sprint x
x = _

为什么在调用seq x () 之后x 没有被评估为102

【问题讨论】:

    标签: haskell


    【解决方案1】:

    与您的last question earlier today 相同的问题。 x 的类型是Num a => a(只需在 GHCi 中尝试:t x)。在明确 a 是什么之前,您无法对此进行评估。 在不知道a 是什么的情况下,无法确定应该使用哪个(+) 函数,因此无法通过thunk 评估x。如果aInt,则GHCi 将调用与aInteger 不同的(+) 函数。

    例如,如果您改为使用let x = 100 + 2 :: Integer,那么一切都会按照您的预期进行。在调用seq 和之后的x = 102 之前,您会得到x = _

    令人困惑的是,如果您只是将x 输入 GHCi,它会返回给您102。这是因为 GHCi 将类型 ax :: Num a => a 专门化为 Integer,允许它评估值,然后打印它。但这对x 没有影响。

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多