2026-09-12
MutableCounter.hs
import Data.IORef
main :: IO ()
main = do
ref <- newIORef (0 :: Int)
modifyIORef' ref (+ 5)
modifyIORef' ref (* 3)
final <- readIORef ref
print final
これは何を出力するでしょうか?
Answer
15です。Haskellのletや関数の引数といった普通の束縛は不変で、一度決めた値を後から書き換えることはできません。本当に「同じ入れ物の中身を順番に更新したい」ときは、Data.IORefのような明示的な可変参照を使います。newIORefで0を入れた箱を作り、modifyIORef' ref (+ 5)で中身を5に、続くmodifyIORef' ref (* 3)で15に更新してからreadIORefで読み出しています。可変にしたい値だけをこうして明示的に選ぶのが、Haskellでの「使い分け」です。