我试图通过以下示例了解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 ()
?
答案 0 :(得分:1)
与last question earlier today相同的问题。 x的类型是Num a => a
(仅在GHCi中尝试:t x
)。您无法对此进行评估,直到明确a
为止。 如果不知道(+)
是什么,就无法确定应使用哪个a
功能,因此x
无法通过thunk 进行评估。如果a
为Int
,则GHCi将调用与(+)
为a
时不同的Integer
函数。
例如,如果你改为let x = 100 + 2 :: Integer
,那么一切都像你期望的那样。在致电x = _
和seq
之后,您会收到x = 102
。
令人困惑的是,如果你只是将x
投入GHCi,那么它会给你回102
。这是因为GHCi专门从a
到x :: Num a => a
的{{1}}类型,允许它评估值,然后打印它。但这对Integer
没有影响。