Я нашел некоторые примеры кода, и изменил его немногоПутаница 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
@MrBones: Потому что такое поведение почти никогда не будет тем, чего хотят люди. Если я напишу 'x = veryExpensiveFunction foobar', а затем' y = x * x + x', я хочу, чтобы «veryExpensiveFunction foobar» оценивался один раз, а не трижды. И это именно то, что делает Haskell (если тип 'x' не является полиморфным). Единственная причина, по которой вы хотите, чтобы он вел себя как нулевая функция в этом случае, заключается в том, что оценка выражения имеет побочные эффекты, что не может произойти даже без небезопасных операций. – sepp2k
В haskell нет такой функции, как нонарная функция. Все функции принимают одно значение (которое может быть кортежем) и возвращают одно значение (которое может быть другой функцией). Функции не «вызывают» - они применяются к значениям, чтобы давать значения. Вы серьезно хотите, чтобы 'foo = 1 + 2' была функцией, которая говорит процессору добавлять 1 и 2 каждый раз, когда вы используете слово foo !? – sclv