我发现了一些示例代码,并改变它一点混乱了IORefs做出反
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每次运行它的时候。
为什么会发生这种情况,我该如何解决这个问题?
为什么它不被视为一个非函数函数? – Squidly 2010-12-16 15:10:41
@MrBones:因为这种行为几乎不会是人们想要的。如果我写'x = veryExpensiveFunction foobar',然后'y = x * x + x',我希望'veryExpensiveFunction foobar'被评估一次,而不是三次。这正是Haskell所做的(除非'x''的类型是多态的)。在这种情况下,您希望它表现为无功能的唯一原因是评估表达式具有副作用,如果没有不安全的操作,这种情况甚至不会发生。 – sepp2k 2010-12-16 15:19:46
haskell中没有这样的事物作为一个非函数函数。函数都取一个值(可能是一个元组)并返回一个值(可能是另一个函数)。函数不被“调用” - 它们被应用于值,以产生值。你是否真的希望'foo = 1 + 2'成为告诉处理器在你每次使用foo!时加1和2的函数? – sclv 2010-12-16 15:22:01