在Haskell中多次(不必要地)评估共享值

时间:2012-01-22 05:20:39

标签: haskell

我读了this回答,这听起来好像评估共享值时,只评估一次,然后存储结果。例如:

x = 2 + 2
y = 2 + x
z = 3 + x

在这里,x被评估一次,然后存储为4,并且永远不再评估它?至少这是我的假设。我的代码有一个值,每次引用时都会重新计算。这是纯粹的价值。什么时候会发生这种情况,我怎样才能强制Haskell在计算出值后记住它?

示例:

x = [1, 1, 2]
count = fst $ getCounts x

此处,每次引用count时都会对其进行评估。

1 个答案:

答案 0 :(得分:8)

正如Daniel Wagner所指出的,这里最可能的情况是count没有给出明确的类型签名,但你已经关闭了单态限制(例如使用NoMonomorphismRestriction语言扩展) 。这意味着count的类型为

count :: (Num a) => a

这意味着GHC将count视为一个函数(具体来说,从任何类型Num的{​​{1}}类型类字典,到a),因此结果不共享,意味着每次使用都会重新计算其值。

最好的解决方案是给计数一个明确的类型签名,例如

a

你也应该为count :: Int 执行相同的操作(并且,就此而言,程序中的所有其他顶级定义)。