为什么延迟评估似乎对Num的工作方式与Haskell中的Int不同?

时间:2015-12-07 22:32:32

标签: haskell

如果我这样做GHCI。

let x = 1 + 2

然后

:sprint x

我得到了

x = _

然后,如果我做

x

3

然后..

:sprint x

我还是

x = _

但是,如果我这样做

let x = 1 + 2 :: Int

然后是第二个:sprint x给了我

3

只是想知道为什么会这样?

1 个答案:

答案 0 :(得分:4)

查看1 + 2的类型:它是Num a => a。这意味着它可以是任何数字类型,由使用x的任何人指定。因此,如果您评估一次,GHCI的默认规则意味着默认为Int,然后您评估x :: Int,这确实是3 :: Int。但是,这不能保存为x的值,因为有人可能会稍后尝试将其用作x :: Double,并且答案会有所不同。