用例子理解`seq`

时间:2015-06-18 03:02:37

标签: haskell

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

Prelude> let x = 100 + 2

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

Prelude> :sprint x
x = _

按照我的理解seq,评估x

Prelude> seq x ()
()

现在,让我们检查x

的值
Prelude> :sprint x
x = _

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

1 个答案:

答案 0 :(得分:1)

last question earlier today相同的问题。 x的类型是Num a => a(仅在GHCi中尝试:t x)。您无法对此进行评估,直到明确a为止。 如果不知道(+)是什么,就无法确定应使用哪个a功能,因此x无法通过thunk 进行评估。如果aInt,则GHCi将调用与(+)a时不同的Integer函数。

例如,如果你改为let x = 100 + 2 :: Integer,那么一切都像你期望的那样。在致电x = _seq之后,您会收到x = 102

令人困惑的是,如果你只是将x投入GHCi,那么它会给你回102。这是因为GHCi专门从ax :: Num a => a的{​​{1}}类型,允许它评估值,然后打印它。但这对Integer没有影响。