我读了this回答,这听起来好像评估共享值时,只评估一次,然后存储结果。例如:
x = 2 + 2
y = 2 + x
z = 3 + x
在这里,x
被评估一次,然后存储为4
,并且永远不再评估它?至少这是我的假设。我的代码有一个值,每次引用时都会重新计算。这是纯粹的价值。什么时候会发生这种情况,我怎样才能强制Haskell在计算出值后记住它?
示例:
x = [1, 1, 2]
count = fst $ getCounts x
此处,每次引用count
时都会对其进行评估。
答案 0 :(得分:8)
正如Daniel Wagner所指出的,这里最可能的情况是count
没有给出明确的类型签名,但你已经关闭了单态限制(例如使用NoMonomorphismRestriction
语言扩展) 。这意味着count
的类型为
count :: (Num a) => a
这意味着GHC将count
视为一个函数(具体来说,从任何类型Num
的{{1}}类型类字典,到a
),因此结果不共享,意味着每次使用都会重新计算其值。
最好的解决方案是给计数一个明确的类型签名,例如
a
你也应该为count :: Int
执行相同的操作(并且,就此而言,程序中的所有其他顶级定义)。