Haskell GHCi 7.8.3中的评估

Haskell GHCi 7.8.3中的评估,haskell,lazy-evaluation,ghci,Haskell,Lazy Evaluation,Ghci,我现在正在读一本关于Haskell并行编程的书。我看到了这样一个例子: Prelude> let x = 2 + 3 Prelude> :sp x x = _ Prelude> x 5 Prelude> :sp x x = 5 但在平台Haskell 2014.02的GHCi 7.8.3中,我得到了以下行为: Prelude> let x = 2 + 3 Prelude> :sp x x = _ Prelude> x 5 Prelude> :sp

我现在正在读一本关于Haskell并行编程的书。我看到了这样一个例子:

Prelude> let x = 2 + 3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = 5
但在平台Haskell 2014.02的GHCi 7.8.3中,我得到了以下行为:

Prelude> let x = 2 + 3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = _
请看最后一行。为什么不计算x?
我尝试使用“seq x()”,但也没有进行评估。

使用
x
单态的类型解决了这个问题

Prelude> let x::Int ; x = 2+3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = 5
这里的问题在于
2+3
可以是任何数字类型,因此
x
更像是一个伪装的函数


P>前一段时间,GHCi默认认为这些定义是单态的。然而,这会导致微妙的类型错误,这一特性通常被称为“可怕的单态限制”。因此,GHCi现在不再应用单态限制。

作为补充说明,GHCi在7.8系列中禁用了单态限制,因此这是一个预期的差异。