我正在阅读一本关于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()”并且它也没有被评估。
答案 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现在不再适用单态限制了。