我發現了一些示例代碼,並改變它一點混亂了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