GHCi评估7.8.3

时间:2014-12-27 09:45:04

标签: 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 x
x = _

见最后一行。为什么不评估x? 我尝试使用“seq x()”并且它也没有被评估。

1 个答案:

答案 0 :(得分:4)

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

Prelude> let x::Int ; x = 2+3
Prelude> :sp x
x = _
Prelude> x
5
Prelude> :sp x
x = 5

这里的问题在于2+3可以是任何数字类型,因此x更像是伪装的函数。

前段时间,GHCi过去常常认为这些定义是单态的。然而,这导致了细微的类型错误,并且这个特征经常被称为“可怕的单形态限制”。因此,GHCi现在不再适用单态限制了。