gpt4 book ai didi

haskell - 对 IORefs 的混淆以制作计数器

转载 作者:行者123 更新时间:2023-12-02 02:52:11 25 4
gpt4 key购买 nike

我找到了一些示例代码,并对其进行了一些更改

counter = unsafePerform $ newIORef 0

newNode _ = unsafePerformIO $
do
i <- readIORef counter
writeIORef counter (i+1)
return i

每次运行时返回 1 然后 2 然后 3 然后 3 等等。

但是当我把它改成
newNode = unsafePerformIO $
do
i <- readIORef counter
writeIORef counter (i+1)
return i

然后每次运行它时我都会得到 0。

为什么会发生这种情况,我可以做些什么来解决它?

最佳答案

在您的第二个版本中 newNode是一个简单的值,而不是一个函数。因此,haskell 只对它进行一次评估,然后在您访问 newNode 时为您提供该评估的结果。 .

警告:使用 unsafePerformIO除了您知道引用透明的 IO 操作之外的任何其他操作都是危险的。它可能会与某些优化产生不良交互,并且通常不会像您期望的那样表现。它的名字中有“不安全”这个词是有原因的。

作为一种玩弄的方式 unsafePerformIO您的代码很好,但如果您想在实际代码中使用类似的东西,我强烈建议您重新考虑。

关于haskell - 对 IORefs 的混淆以制作计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com