在一个简单的例子中,通过打印精细地将WHNF转换为NF
Prelude> let x = 1 + 2 :: Int
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = 3但在一种情况下,类型没有声明它不工作。
Prelude> let x = 1 + 2
Prelude> :sprint x
x = _
Prelude> x
3
Prelude> :sprint x
x = _你能详细解释一下为什么在最后一种情况下转换不起作用吗?
发布于 2018-11-28 10:34:33
由于在GHCi中禁用了单形限制,所以最后一个x是x :: Num a => a类型的多态值。所以它不是一个简单的整数,而是一种函数DictNum a -> a,它可以在任何数字类型中创建一个值。
实际上,x :: Int, x :: Float, x :: Double将运行并产生不同的值。这些值在数值上是相同的,但在计算上不同,因为它们是不同类型的表示。
由于x本质上是“按需生成的多个值”,所以这里没有单一的WHNF或NF。
注意,如果我们计算(x :: Int) + (x :: Int),那么x将被重新计算两次: GHC通常不会为连续的计算“缓存”Int类型的WHNF。这类似于f 3 + f 3,在那里f 3没有缓存(回忆录)。
这种重复计算正是单态限制所要避免的。
https://stackoverflow.com/questions/53517200
复制相似问题