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