Squ*_*dly 4 monads haskell unsafe-perform-io ioref
我找到了一些示例代码,并稍微改了一下
counter = unsafePerform $ newIORef 0
newNode _ = unsafePerformIO $
do
i <- readIORef counter
writeIORef counter (i+1)
return i
Run Code Online (Sandbox Code Playgroud)
每次运行时返回1然后2然后3然后3等.
但是当我改变它
newNode = unsafePerformIO $
do
i <- readIORef counter
writeIORef counter (i+1)
return i
Run Code Online (Sandbox Code Playgroud)
然后我每次运行都得0.
为什么会发生这种情况,我该怎么做才能解决这个问题?
sep*_*p2k 10
在你的第二个版本newNode是一个简单的值,而不是一个函数.因此,haskell只对其进行一次评估,然后在您访问时为您提供评估结果newNode.
警告:使用unsafePerformIO除了IO操作之外的任何其他任何您认为是引用透明的操作都是危险的.它可能与某些优化相互影响很严重,而且通常不像您期望的那样.有一个原因是它的名字中有"不安全"这个词.
作为一种使用unsafePerformIO代码的方法很好,但如果您想在实际代码中使用类似的东西,我强烈建议您重新考虑.