Haskell 自習してるんだけど、参照型 IORef の動作がよくわからない。
例えば次のコードを走らせたとき、関数 writeIORef の引数 r の中身が変わってる。
引数の値を変えるなんて Haskell でできるの?

import Data.IORef

main = do
r <- newIORef 0
x <- readIORef r
print x
writeIORef r 1
x <- readIORef r
print x

そもそも、こういうのって関数の副作用とは言わないの?
俺は、純粋関数とは数学的な関数の挙動と同じにしようって
思想だと理解していたんだが、もっとゆるいんかな。