假设我用GHCi编写:let x = 1 + 2 :: Integer
seq x ()
输入后:sprint x
GHCi自然会打印x = 3
。
但是,let x = 1 + 2
seq x ()
之后:sprint x
产量x = _
两个表达式之间的唯一区别是它们的类型(Integer
与Num a => a
)。我的问题是究竟发生了什么,为什么在后面的示例中似乎没有评估x
。
主要问题是
let x = 1 + 2
定义类型为forall a. Num a => a
的polymorphic值,这与函数的计算结果相似。
x
的每次使用可以使用不同的类型,例如x :: Int
,x :: Integer
,x :: Double
等。这些结果不会以任何方式“缓存”,而是每次都重新计算,就好像x
是被多次调用的函数一样。